Sophie

Sophie

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

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-marshal.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-marshal.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-marshal.c  Marshalling routines</font>
00003 <font class="comment"> *</font>
00004 <font class="comment"> * Copyright (C) 2002 CodeFactory AB</font>
00005 <font class="comment"> * Copyright (C) 2003, 2004 Red Hat, Inc.</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-marshal.h"</font>
00026 <font class="preprocessor">#include "dbus-internals.h"</font>
00027 <font class="preprocessor">#define DBUS_CAN_USE_DBUS_STRING_PRIVATE 1</font>
00028 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-string-private.h"</font>
00029 
00030 <font class="preprocessor">#include &lt;string.h&gt;</font>
00031 
00043 <font class="keyword">static</font> dbus_uint32_t
00044 unpack_4_octets (<font class="keywordtype">int</font>                  byte_order,
00045                  <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00046 {
00047   _dbus_assert (_DBUS_ALIGN_ADDRESS (data, 4) == data);
00048   
00049   <font class="keywordflow">if</font> (byte_order == DBUS_LITTLE_ENDIAN)
00050     <font class="keywordflow">return</font> DBUS_UINT32_FROM_LE (*(dbus_uint32_t*)data);
00051   <font class="keywordflow">else</font>
00052     <font class="keywordflow">return</font> DBUS_UINT32_FROM_BE (*(dbus_uint32_t*)data);
00053 }
00054 
00055 <font class="preprocessor">#ifndef DBUS_HAVE_INT64</font>
00056 <font class="preprocessor"></font><font class="comment">/* from ORBit */</font>
00057 <font class="keyword">static</font> <font class="keywordtype">void</font>
00058 swap_bytes (<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data,
00059             <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font>   len)
00060 {
00061   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p1 = data;
00062   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *p2 = data + len - 1;
00063 
00064   <font class="keywordflow">while</font> (p1 &lt; p2)
00065     {
00066       <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> tmp = *p1;
00067       *p1 = *p2;
00068       *p2 = tmp;
00069 
00070       --p2;
00071       ++p1;
00072     }
00073 }
00074 <font class="preprocessor">#endif </font><font class="comment">/* !DBUS_HAVE_INT64 */</font>
00075 
<a name="l00080"></a><a class="code" href="unionDBusOctets8.html">00080</a> <font class="keyword">typedef</font> <font class="keyword">union</font>
00081 <font class="keyword"></font>{
00082 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
<a name="l00083"></a><a class="code" href="unionDBusOctets8.html#m0">00083</a> <font class="preprocessor"></font>  dbus_int64_t  s; 
<a name="l00084"></a><a class="code" href="unionDBusOctets8.html#m1">00084</a>   dbus_uint64_t u; 
00085 <font class="preprocessor">#endif</font>
<a name="l00086"></a><a class="code" href="unionDBusOctets8.html#m2">00086</a> <font class="preprocessor"></font>  <font class="keywordtype">double</font> d;        
00087 } <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>;
00088 
00089 <font class="keyword">static</font> <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>
00090 unpack_8_octets (<font class="keywordtype">int</font>                  byte_order,
00091                  <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00092 {
00093   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00094   
00095   _dbus_assert (_DBUS_ALIGN_ADDRESS (data, 8) == data);
00096   _dbus_assert (<font class="keyword">sizeof</font> (r) == 8);
00097   
00098 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00099 <font class="preprocessor"></font>  <font class="keywordflow">if</font> (byte_order == DBUS_LITTLE_ENDIAN)
00100     r.<a class="code" href="unionDBusOctets8.html#m1">u</a> = DBUS_UINT64_FROM_LE (*(dbus_uint64_t*)data);
00101   <font class="keywordflow">else</font>
00102     r.<a class="code" href="unionDBusOctets8.html#m1">u</a> = DBUS_UINT64_FROM_BE (*(dbus_uint64_t*)data);
00103 <font class="preprocessor">#else</font>
00104 <font class="preprocessor"></font>  r.<a class="code" href="unionDBusOctets8.html#m2">d</a> = *(<font class="keywordtype">double</font>*)data;
00105   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
00106     swap_bytes ((<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) &amp;r, <font class="keyword">sizeof</font> (r));
00107 <font class="preprocessor">#endif</font>
00108 <font class="preprocessor"></font>  
00109   <font class="keywordflow">return</font> r;
00110 }
00111 
00119 dbus_uint32_t
<a name="l00120"></a><a class="code" href="group__DBusMarshal.html#a2">00120</a> _dbus_unpack_uint32 (<font class="keywordtype">int</font>                  byte_order,
00121                      <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00122 {
00123   <font class="keywordflow">return</font> unpack_4_octets (byte_order, data);
00124 }  
00125 
00133 dbus_int32_t
<a name="l00134"></a><a class="code" href="group__DBusMarshal.html#a3">00134</a> _dbus_unpack_int32 (<font class="keywordtype">int</font>                  byte_order,
00135                     <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00136 {
00137   <font class="keywordflow">return</font> (dbus_int32_t) unpack_4_octets (byte_order, data);
00138 }
00139 
00140 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00141 <font class="preprocessor"></font>
00148 dbus_uint64_t
<a name="l00149"></a><a class="code" href="group__DBusMarshal.html#a4">00149</a> _dbus_unpack_uint64 (<font class="keywordtype">int</font>                  byte_order,
00150                      <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00151 {
00152   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00153   
00154   r = unpack_8_octets (byte_order, data);
00155 
00156   <font class="keywordflow">return</font> r.<a class="code" href="unionDBusOctets8.html#m1">u</a>;
00157 }  
00158 
00166 dbus_int64_t
<a name="l00167"></a><a class="code" href="group__DBusMarshal.html#a5">00167</a> _dbus_unpack_int64 (<font class="keywordtype">int</font>                  byte_order,
00168                     <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00169 {
00170   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00171   
00172   r = unpack_8_octets (byte_order, data);
00173 
00174   <font class="keywordflow">return</font> r.<a class="code" href="unionDBusOctets8.html#m0">s</a>;
00175 }
00176 
00177 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
00178 
00179 <font class="keyword">static</font> <font class="keywordtype">void</font>
00180 pack_4_octets (dbus_uint32_t   value,
00181                <font class="keywordtype">int</font>             byte_order,
00182                <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  *data)
00183 {
00184   _dbus_assert (_DBUS_ALIGN_ADDRESS (data, 4) == data);
00185   
00186   <font class="keywordflow">if</font> ((byte_order) == DBUS_LITTLE_ENDIAN)                  
00187     *((dbus_uint32_t*)(data)) = DBUS_UINT32_TO_LE (value);       
00188   <font class="keywordflow">else</font>
00189     *((dbus_uint32_t*)(data)) = DBUS_UINT32_TO_BE (value);
00190 }
00191 
00192 <font class="keyword">static</font> <font class="keywordtype">void</font>
00193 pack_8_octets (<a class="code" href="unionDBusOctets8.html">DBusOctets8</a>     value,
00194                <font class="keywordtype">int</font>             byte_order,
00195                <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  *data)
00196 {
00197   _dbus_assert (_DBUS_ALIGN_ADDRESS (data, 8) == data);
00198 
00199 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00200 <font class="preprocessor"></font>  <font class="keywordflow">if</font> ((byte_order) == DBUS_LITTLE_ENDIAN)                  
00201     *((dbus_uint64_t*)(data)) = DBUS_UINT64_TO_LE (value.<a class="code" href="unionDBusOctets8.html#m1">u</a>); 
00202   <font class="keywordflow">else</font>
00203     *((dbus_uint64_t*)(data)) = DBUS_UINT64_TO_BE (value.<a class="code" href="unionDBusOctets8.html#m1">u</a>);
00204 <font class="preprocessor">#else</font>
00205 <font class="preprocessor"></font>  memcpy (data, &amp;value, 8);
00206   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
00207     swap_bytes ((<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *)data, 8);
00208 <font class="preprocessor">#endif</font>
00209 <font class="preprocessor"></font>}
00210 
00218 <font class="keywordtype">void</font>
<a name="l00219"></a><a class="code" href="group__DBusMarshal.html#a8">00219</a> _dbus_pack_uint32 (dbus_uint32_t   value,
00220                    <font class="keywordtype">int</font>             byte_order,
00221                    <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  *data)
00222 {
00223   pack_4_octets (value, byte_order, data);
00224 }
00225 
00233 <font class="keywordtype">void</font>
<a name="l00234"></a><a class="code" href="group__DBusMarshal.html#a9">00234</a> _dbus_pack_int32 (dbus_int32_t   value,
00235                   <font class="keywordtype">int</font>            byte_order,
00236                   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00237 {
00238   pack_4_octets ((dbus_uint32_t) value, byte_order, data);
00239 }
00240 
00241 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00242 <font class="preprocessor"></font>
00249 <font class="keywordtype">void</font>
<a name="l00250"></a><a class="code" href="group__DBusMarshal.html#a10">00250</a> _dbus_pack_uint64 (dbus_uint64_t   value,
00251                    <font class="keywordtype">int</font>             byte_order,
00252                    <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>  *data)
00253 {
00254   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00255   r.<a class="code" href="unionDBusOctets8.html#m1">u</a> = value;
00256   pack_8_octets (r, byte_order, data);
00257 }
00258 
00266 <font class="keywordtype">void</font>
<a name="l00267"></a><a class="code" href="group__DBusMarshal.html#a11">00267</a> _dbus_pack_int64 (dbus_int64_t   value,
00268                   <font class="keywordtype">int</font>            byte_order,
00269                   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data)
00270 {
00271   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00272   r.<a class="code" href="unionDBusOctets8.html#m0">s</a> = value;
00273   pack_8_octets (r, byte_order, data);
00274 }
00275 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
00276 
00277 <font class="keyword">static</font> <font class="keywordtype">void</font>
00278 set_4_octets (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00279               <font class="keywordtype">int</font>                  byte_order,
00280               <font class="keywordtype">int</font>                  offset,
00281               dbus_uint32_t        value)
00282 {
00283   <font class="keywordtype">char</font> *data;
00284   
00285   _dbus_assert (byte_order == DBUS_LITTLE_ENDIAN ||
00286                 byte_order == DBUS_BIG_ENDIAN);
00287   
00288   data = _dbus_string_get_data_len (str, offset, 4);
00289 
00290   _dbus_pack_uint32 (value, byte_order, data);
00291 }
00292 
00293 <font class="keyword">static</font> <font class="keywordtype">void</font>
00294 set_8_octets (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00295               <font class="keywordtype">int</font>                  byte_order,
00296               <font class="keywordtype">int</font>                  offset,
00297               <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>          value)
00298 {
00299   <font class="keywordtype">char</font> *data;
00300   
00301   _dbus_assert (byte_order == DBUS_LITTLE_ENDIAN ||
00302                 byte_order == DBUS_BIG_ENDIAN);
00303   
00304   data = _dbus_string_get_data_len (str, offset, 8);
00305 
00306   pack_8_octets (value, byte_order, data);
00307 }
00308 
00319 <font class="keywordtype">void</font>
<a name="l00320"></a><a class="code" href="group__DBusMarshal.html#a14">00320</a> _dbus_marshal_set_int32 (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00321                          <font class="keywordtype">int</font>                  byte_order,
00322                          <font class="keywordtype">int</font>                  offset,
00323                          dbus_int32_t         value)
00324 {
00325   set_4_octets (str, byte_order, offset, (dbus_uint32_t) value);
00326 }
00327 
00338 <font class="keywordtype">void</font>
<a name="l00339"></a><a class="code" href="group__DBusMarshal.html#a15">00339</a> _dbus_marshal_set_uint32 (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00340                           <font class="keywordtype">int</font>                  byte_order,
00341                           <font class="keywordtype">int</font>                  offset,
00342                           dbus_uint32_t        value)
00343 {
00344   set_4_octets (str, byte_order, offset, value);
00345 }
00346 
00347 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00348 <font class="preprocessor"></font>
00359 <font class="keywordtype">void</font>
<a name="l00360"></a><a class="code" href="group__DBusMarshal.html#a16">00360</a> _dbus_marshal_set_int64 (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00361                          <font class="keywordtype">int</font>                  byte_order,
00362                          <font class="keywordtype">int</font>                  offset,
00363                          dbus_int64_t         value)
00364 {
00365   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00366   r.<a class="code" href="unionDBusOctets8.html#m0">s</a> = value;
00367   set_8_octets (str, byte_order, offset, r);
00368 }
00369 
00380 <font class="keywordtype">void</font>
<a name="l00381"></a><a class="code" href="group__DBusMarshal.html#a17">00381</a> _dbus_marshal_set_uint64 (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00382                           <font class="keywordtype">int</font>                  byte_order,
00383                           <font class="keywordtype">int</font>                  offset,
00384                           dbus_uint64_t        value)
00385 {
00386   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00387   r.<a class="code" href="unionDBusOctets8.html#m1">u</a> = value;
00388   set_8_octets (str, byte_order, offset, r);
00389 }
00390 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
00391 
00410 dbus_bool_t
<a name="l00411"></a><a class="code" href="group__DBusMarshal.html#a18">00411</a> _dbus_marshal_set_string (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00412                           <font class="keywordtype">int</font>                  byte_order,
00413                           <font class="keywordtype">int</font>                  offset,
00414                           <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    *value,
00415                           <font class="keywordtype">int</font>                  len)
00416 {
00417   <font class="keywordtype">int</font> old_len;
00418   
00419   _dbus_assert (byte_order == DBUS_LITTLE_ENDIAN ||
00420                 byte_order == DBUS_BIG_ENDIAN);
00421   
00422   old_len = _dbus_demarshal_uint32 (str, byte_order,
00423                                     offset, NULL);
00424 
00425   <font class="keywordflow">if</font> (!_dbus_string_replace_len (value, 0, len,
00426                                  str, offset + 4, old_len))
00427     <font class="keywordflow">return</font> FALSE;
00428 
00429   _dbus_marshal_set_uint32 (str, byte_order,
00430                             offset, len);
00431 
00432   <font class="keywordflow">return</font> TRUE;
00433 }
00434 
00448 <font class="keywordtype">void</font>
<a name="l00449"></a><a class="code" href="group__DBusMarshal.html#a19">00449</a> _dbus_marshal_set_object_path (<a class="code" href="structDBusString.html">DBusString</a>         *str,
00450                                <font class="keywordtype">int</font>                 byte_order,
00451                                <font class="keywordtype">int</font>                 offset,
00452                                <font class="keyword">const</font> <font class="keywordtype">char</font>        **path,
00453                                <font class="keywordtype">int</font>                 path_len)
00454 {
00455 
00456   <font class="comment">/* FIXME */</font>
00457 }
00458 
00459 <font class="keyword">static</font> dbus_bool_t
00460 marshal_4_octets (<a class="code" href="structDBusString.html">DBusString</a>   *str,
00461                   <font class="keywordtype">int</font>           byte_order,
00462                   dbus_uint32_t value)
00463 {
00464   _dbus_assert (<font class="keyword">sizeof</font> (value) == 4);
00465   
00466   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
00467     value = DBUS_UINT32_SWAP_LE_BE (value);
00468 
00469   <font class="keywordflow">return</font> _dbus_string_append_4_aligned (str,
00470                                         (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *)&amp;value);
00471 }
00472 
00473 <font class="keyword">static</font> dbus_bool_t
00474 marshal_8_octets (<a class="code" href="structDBusString.html">DBusString</a> *str,
00475                   <font class="keywordtype">int</font>         byte_order,
00476                   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> value)
00477 {
00478   _dbus_assert (<font class="keyword">sizeof</font> (value) == 8);
00479   
00480   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
00481     pack_8_octets (value, byte_order, (<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) &amp;value); <font class="comment">/* pack into self, swapping as we go */</font>
00482 
00483   <font class="keywordflow">return</font> _dbus_string_append_8_aligned (str,
00484                                         (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *)&amp;value);
00485 }
00486 
00495 dbus_bool_t
<a name="l00496"></a><a class="code" href="group__DBusMarshal.html#a22">00496</a> _dbus_marshal_double (<a class="code" href="structDBusString.html">DBusString</a> *str,
00497                       <font class="keywordtype">int</font>         byte_order,
00498                       <font class="keywordtype">double</font>      value)
00499 {
00500   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00501   r.<a class="code" href="unionDBusOctets8.html#m2">d</a> = value;
00502   <font class="keywordflow">return</font> marshal_8_octets (str, byte_order, r);
00503 }
00504 
00513 dbus_bool_t
<a name="l00514"></a><a class="code" href="group__DBusMarshal.html#a23">00514</a> _dbus_marshal_int32  (<a class="code" href="structDBusString.html">DBusString</a>   *str,
00515                       <font class="keywordtype">int</font>           byte_order,
00516                       dbus_int32_t  value)
00517 {
00518   <font class="keywordflow">return</font> marshal_4_octets (str, byte_order, (dbus_uint32_t) value);
00519 }
00520 
00529 dbus_bool_t
<a name="l00530"></a><a class="code" href="group__DBusMarshal.html#a24">00530</a> _dbus_marshal_uint32 (<a class="code" href="structDBusString.html">DBusString</a>    *str,
00531                       <font class="keywordtype">int</font>            byte_order,
00532                       dbus_uint32_t  value)
00533 {
00534   <font class="keywordflow">return</font> marshal_4_octets (str, byte_order, value);
00535 }
00536 
00537 
00538 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00539 <font class="preprocessor"></font>
00547 dbus_bool_t
<a name="l00548"></a><a class="code" href="group__DBusMarshal.html#a25">00548</a> _dbus_marshal_int64  (<a class="code" href="structDBusString.html">DBusString</a>   *str,
00549                       <font class="keywordtype">int</font>           byte_order,
00550                       dbus_int64_t  value)
00551 {
00552   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00553   r.<a class="code" href="unionDBusOctets8.html#m0">s</a> = value;
00554   <font class="keywordflow">return</font> marshal_8_octets (str, byte_order, r);
00555 }
00556 
00565 dbus_bool_t
<a name="l00566"></a><a class="code" href="group__DBusMarshal.html#a26">00566</a> _dbus_marshal_uint64 (<a class="code" href="structDBusString.html">DBusString</a>    *str,
00567                       <font class="keywordtype">int</font>            byte_order,
00568                       dbus_uint64_t  value)
00569 {
00570   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
00571   r.<a class="code" href="unionDBusOctets8.html#m1">u</a> = value;
00572   <font class="keywordflow">return</font> marshal_8_octets (str, byte_order, r);
00573 }
00574 
00575 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
00576 
00588 dbus_bool_t
<a name="l00589"></a><a class="code" href="group__DBusMarshal.html#a27">00589</a> _dbus_marshal_string (<a class="code" href="structDBusString.html">DBusString</a>    *str,
00590                       <font class="keywordtype">int</font>            byte_order,
00591                       <font class="keyword">const</font> <font class="keywordtype">char</font>    *value)
00592 {
00593   <font class="keywordtype">int</font> len, old_string_len;
00594 
00595   old_string_len = _dbus_string_get_length (str);
00596   
00597   len = strlen (value);
00598 
00599   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, len))
00600     {
00601       <font class="comment">/* Restore the previous length */</font>
00602       _dbus_string_set_length (str, old_string_len);
00603 
00604       <font class="keywordflow">return</font> FALSE;
00605     }
00606 
00607   <font class="keywordflow">return</font> _dbus_string_append_len (str, value, len + 1);
00608 }
00609 
00622 dbus_bool_t
<a name="l00623"></a><a class="code" href="group__DBusMarshal.html#a28">00623</a> _dbus_marshal_string_len (<a class="code" href="structDBusString.html">DBusString</a>    *str,
00624                           <font class="keywordtype">int</font>            byte_order,
00625                           <font class="keyword">const</font> <font class="keywordtype">char</font>    *value,
00626                           <font class="keywordtype">int</font>            len)
00627 {
00628   <font class="keywordtype">int</font> old_string_len;
00629 
00630   old_string_len = _dbus_string_get_length (str);
00631 
00632   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, len))
00633     {
00634       <font class="comment">/* Restore the previous length */</font>
00635       _dbus_string_set_length (str, old_string_len);
00636 
00637       <font class="keywordflow">return</font> FALSE;
00638     }
00639 
00640   <font class="keywordflow">if</font> (!_dbus_string_append_len (str, value, len))
00641     <font class="keywordflow">return</font> FALSE;
00642 
00643   <font class="comment">/* add a nul byte */</font>
00644   <font class="keywordflow">if</font> (!_dbus_string_lengthen (str, 1))
00645     <font class="keywordflow">return</font> FALSE;
00646 
00647   <font class="keywordflow">return</font> TRUE;
00648 }
00649 
00659 dbus_bool_t
<a name="l00660"></a><a class="code" href="group__DBusMarshal.html#a29">00660</a> _dbus_marshal_byte_array (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00661                           <font class="keywordtype">int</font>                  byte_order,
00662                           <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *value,
00663                           <font class="keywordtype">int</font>                  len)
00664 {
00665   <font class="keywordtype">int</font> old_string_len;
00666 
00667   old_string_len = _dbus_string_get_length (str);
00668   
00669   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, len))
00670     {
00671       <font class="comment">/* Restore the previous length */</font>
00672       _dbus_string_set_length (str, old_string_len);
00673 
00674       <font class="keywordflow">return</font> FALSE;
00675     }
00676 
00677   <font class="keywordflow">if</font> (len == 0)
00678     <font class="keywordflow">return</font> TRUE;
00679   <font class="keywordflow">else</font>
00680     <font class="keywordflow">return</font> _dbus_string_append_len (str, value, len);
00681 }
00682 
00683 <font class="keyword">static</font> dbus_bool_t
00684 marshal_4_octets_array (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00685                         <font class="keywordtype">int</font>                  byte_order,
00686                         <font class="keyword">const</font> dbus_uint32_t *value,
00687                         <font class="keywordtype">int</font>                  len)
00688 {
00689   <font class="keywordtype">int</font> old_string_len;
00690   <font class="keywordtype">int</font> array_start;
00691 
00692   old_string_len = _dbus_string_get_length (str);
00693 
00694   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, len * 4))
00695     <font class="keywordflow">goto</font> error;
00696 
00697   array_start = _dbus_string_get_length (str);
00698   
00699   <font class="keywordflow">if</font> (!_dbus_string_append_len (str, (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) value,
00700                                 len * 4))
00701     <font class="keywordflow">goto</font> error;
00702   
00703   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
00704     {
00705       <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *d;
00706       <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
00707       
00708       d = _dbus_string_get_data (str) + array_start;
00709       end = d + len * 4;
00710       <font class="keywordflow">while</font> (d != end)
00711         {
00712           *((dbus_uint32_t*)d) = DBUS_UINT32_SWAP_LE_BE (*((dbus_uint32_t*)d));
00713           d += 4;
00714         }
00715     }
00716 
00717   <font class="keywordflow">return</font> TRUE;
00718   
00719  error:
00720   <font class="comment">/* Restore previous length */</font>
00721   _dbus_string_set_length (str, old_string_len);
00722   
00723   <font class="keywordflow">return</font> FALSE;  
00724 }
00725 
00726 <font class="keyword">static</font> dbus_bool_t
00727 marshal_8_octets_array (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00728                         <font class="keywordtype">int</font>                  byte_order,
00729                         <font class="keyword">const</font> <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>   *value,
00730                         <font class="keywordtype">int</font>                  len)
00731 {
00732   <font class="keywordtype">int</font> old_string_len;
00733   <font class="keywordtype">int</font> array_start;
00734 
00735   old_string_len = _dbus_string_get_length (str);
00736 
00737   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, len * 8))
00738     <font class="keywordflow">goto</font> error;
00739 
00740   array_start = _dbus_string_get_length (str);
00741   
00742   <font class="keywordflow">if</font> (!_dbus_string_append_len (str, (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) value,
00743                                 len * 8))
00744     <font class="keywordflow">goto</font> error;
00745   
00746   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
00747     {
00748       <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *d;
00749       <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *end;
00750       
00751       d = _dbus_string_get_data (str) + array_start;
00752       end = d + len * 8;
00753       <font class="keywordflow">while</font> (d != end)
00754         {
00755 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00756 <font class="preprocessor"></font>          *((dbus_uint64_t*)d) = DBUS_UINT64_SWAP_LE_BE (*((dbus_uint64_t*)d));
00757 <font class="preprocessor">#else</font>
00758 <font class="preprocessor"></font>          swap_bytes ((<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*) d, 8);
00759 <font class="preprocessor">#endif</font>
00760 <font class="preprocessor"></font>          d += 8;
00761         }
00762     }
00763 
00764   <font class="keywordflow">return</font> TRUE;
00765   
00766  error:
00767   <font class="comment">/* Restore previous length */</font>
00768   _dbus_string_set_length (str, old_string_len);
00769   
00770   <font class="keywordflow">return</font> FALSE;  
00771 }
00772 
00782 dbus_bool_t
<a name="l00783"></a><a class="code" href="group__DBusMarshal.html#a32">00783</a> _dbus_marshal_int32_array (<a class="code" href="structDBusString.html">DBusString</a>         *str,
00784                            <font class="keywordtype">int</font>                 byte_order,
00785                            <font class="keyword">const</font> dbus_int32_t *value,
00786                            <font class="keywordtype">int</font>                 len)
00787 {
00788   <font class="keywordflow">return</font> marshal_4_octets_array (str, byte_order,
00789                                  (<font class="keyword">const</font> dbus_uint32_t*) value,
00790                                  len);
00791 }
00792 
00802 dbus_bool_t
<a name="l00803"></a><a class="code" href="group__DBusMarshal.html#a33">00803</a> _dbus_marshal_uint32_array (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00804                             <font class="keywordtype">int</font>                  byte_order,
00805                             <font class="keyword">const</font> dbus_uint32_t  *value,
00806                             <font class="keywordtype">int</font>                  len)
00807 {
00808   <font class="keywordflow">return</font> marshal_4_octets_array (str, byte_order,
00809                                  value,
00810                                  len);
00811 }
00812 
00813 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
00814 <font class="preprocessor"></font>
00824 dbus_bool_t
<a name="l00825"></a><a class="code" href="group__DBusMarshal.html#a34">00825</a> _dbus_marshal_int64_array (<a class="code" href="structDBusString.html">DBusString</a>         *str,
00826                            <font class="keywordtype">int</font>                 byte_order,
00827                            <font class="keyword">const</font> dbus_int64_t *value,
00828                            <font class="keywordtype">int</font>                 len)
00829 {
00830   <font class="keywordflow">return</font> marshal_8_octets_array (str, byte_order,
00831                                  (<font class="keyword">const</font> <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>*) value,
00832                                  len);
00833 }
00834 
00844 dbus_bool_t
<a name="l00845"></a><a class="code" href="group__DBusMarshal.html#a35">00845</a> _dbus_marshal_uint64_array (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00846                             <font class="keywordtype">int</font>                  byte_order,
00847                             <font class="keyword">const</font> dbus_uint64_t  *value,
00848                             <font class="keywordtype">int</font>                  len)
00849 {
00850   <font class="keywordflow">return</font> marshal_8_octets_array (str, byte_order,
00851                                  (<font class="keyword">const</font> <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>*) value,
00852                                  len);
00853 }
00854 
00855 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
00856 
00866 dbus_bool_t
<a name="l00867"></a><a class="code" href="group__DBusMarshal.html#a36">00867</a> _dbus_marshal_double_array (<a class="code" href="structDBusString.html">DBusString</a>          *str,
00868                             <font class="keywordtype">int</font>                  byte_order,
00869                             <font class="keyword">const</font> <font class="keywordtype">double</font>        *value,
00870                             <font class="keywordtype">int</font>                  len)
00871 {
00872   <font class="keywordflow">return</font> marshal_8_octets_array (str, byte_order,
00873                                  (<font class="keyword">const</font> <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>*) value,
00874                                  len);
00875 }
00876 
00886 dbus_bool_t
<a name="l00887"></a><a class="code" href="group__DBusMarshal.html#a37">00887</a> _dbus_marshal_string_array (<a class="code" href="structDBusString.html">DBusString</a>  *str,
00888                             <font class="keywordtype">int</font>          byte_order,
00889                             <font class="keyword">const</font> <font class="keywordtype">char</font> **value,
00890                             <font class="keywordtype">int</font>          len)
00891 {
00892   <font class="keywordtype">int</font> i, old_string_len, array_start;
00893 
00894   old_string_len = _dbus_string_get_length (str);
00895 
00896   <font class="comment">/* Set the length to 0 temporarily */</font>
00897   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, 0))
00898     <font class="keywordflow">goto</font> error;
00899 
00900   array_start = _dbus_string_get_length (str);
00901   
00902   <font class="keywordflow">for</font> (i = 0; i &lt; len; i++)
00903     <font class="keywordflow">if</font> (!_dbus_marshal_string (str, byte_order, value[i]))
00904       <font class="keywordflow">goto</font> error;
00905 
00906   <font class="comment">/* Write the length now that we know it */</font>
00907   _dbus_marshal_set_uint32 (str, byte_order,
00908                             _DBUS_ALIGN_VALUE (old_string_len, <font class="keyword">sizeof</font>(dbus_uint32_t)),
00909                             _dbus_string_get_length (str) - array_start);
00910   
00911   <font class="keywordflow">return</font> TRUE;
00912   
00913  error:
00914   <font class="comment">/* Restore previous length */</font>
00915   _dbus_string_set_length (str, old_string_len);
00916   
00917   <font class="keywordflow">return</font> FALSE;      
00918 }
00919 
00929 dbus_bool_t
<a name="l00930"></a><a class="code" href="group__DBusMarshal.html#a38">00930</a> _dbus_marshal_object_path (<a class="code" href="structDBusString.html">DBusString</a>            *str,
00931                            <font class="keywordtype">int</font>                    byte_order,
00932                            <font class="keyword">const</font> <font class="keywordtype">char</font>           **path,
00933                            <font class="keywordtype">int</font>                    path_len)
00934 {
00935   <font class="keywordtype">int</font> array_start, old_string_len;
00936   <font class="keywordtype">int</font> i;
00937   
00938   old_string_len = _dbus_string_get_length (str);
00939   
00940   <font class="comment">/* Set the length to 0 temporarily */</font>
00941   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (str, byte_order, 0))
00942     <font class="keywordflow">goto</font> nomem;
00943 
00944   array_start = _dbus_string_get_length (str);
00945   
00946   i = 0;
00947   <font class="keywordflow">while</font> (i &lt; path_len)
00948     {
00949       <font class="keywordflow">if</font> (!_dbus_string_append_byte (str, <font class="charliteral">'/'</font>))
00950         <font class="keywordflow">goto</font> nomem;
00951       
00952       <font class="keywordflow">if</font> (!_dbus_string_append (str, path[0]))
00953         <font class="keywordflow">goto</font> nomem;
00954 
00955       ++i;
00956     }
00957 
00958   <font class="comment">/* Write the length now that we know it */</font>
00959   _dbus_marshal_set_uint32 (str, byte_order,
00960                             _DBUS_ALIGN_VALUE (old_string_len, <font class="keyword">sizeof</font>(dbus_uint32_t)),
00961                             _dbus_string_get_length (str) - array_start);  
00962 
00963   <font class="keywordflow">return</font> TRUE;
00964 
00965  nomem:
00966   <font class="comment">/* Restore the previous length */</font>
00967   _dbus_string_set_length (str, old_string_len);
00968   
00969   <font class="keywordflow">return</font> FALSE;
00970 }
00971 
00972 <font class="keyword">static</font> dbus_uint32_t
00973 demarshal_4_octets (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
00974                     <font class="keywordtype">int</font>               byte_order,
00975                     <font class="keywordtype">int</font>               pos,
00976                     <font class="keywordtype">int</font>              *new_pos)
00977 {
00978   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) str;
00979   
00980   pos = _DBUS_ALIGN_VALUE (pos, 4);
00981   
00982   <font class="keywordflow">if</font> (new_pos)
00983     *new_pos = pos + 4;
00984 
00985   <font class="keywordflow">return</font> unpack_4_octets (byte_order, real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + pos);
00986 }
00987 
00988 <font class="keyword">static</font> <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>
00989 demarshal_8_octets (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
00990                     <font class="keywordtype">int</font>               byte_order,
00991                     <font class="keywordtype">int</font>               pos,
00992                     <font class="keywordtype">int</font>              *new_pos)
00993 {
00994   <font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a> *real = (<font class="keyword">const</font> <a class="code" href="structDBusRealString.html">DBusRealString</a>*) str;
00995   
00996   pos = _DBUS_ALIGN_VALUE (pos, 8);
00997   
00998   <font class="keywordflow">if</font> (new_pos)
00999     *new_pos = pos + 8;
01000 
01001   <font class="keywordflow">return</font> unpack_8_octets (byte_order, real-&gt;<a class="code" href="structDBusRealString.html#m0">str</a> + pos);
01002 }
01003 
01013 <font class="keywordtype">double</font>
<a name="l01014"></a><a class="code" href="group__DBusMarshal.html#a41">01014</a> _dbus_demarshal_double (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01015                         <font class="keywordtype">int</font>                byte_order,
01016                         <font class="keywordtype">int</font>                pos,
01017                         <font class="keywordtype">int</font>               *new_pos)
01018 {
01019   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
01020 
01021   r = demarshal_8_octets (str, byte_order, pos, new_pos);
01022 
01023   <font class="keywordflow">return</font> r.<a class="code" href="unionDBusOctets8.html#m2">d</a>;
01024 }
01025 
01035 dbus_int32_t
<a name="l01036"></a><a class="code" href="group__DBusMarshal.html#a42">01036</a> _dbus_demarshal_int32  (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01037                         <font class="keywordtype">int</font>               byte_order,
01038                         <font class="keywordtype">int</font>               pos,
01039                         <font class="keywordtype">int</font>              *new_pos)
01040 {
01041   <font class="keywordflow">return</font> (dbus_int32_t) demarshal_4_octets (str, byte_order, pos, new_pos);
01042 }
01043 
01053 dbus_uint32_t
<a name="l01054"></a><a class="code" href="group__DBusMarshal.html#a43">01054</a> _dbus_demarshal_uint32  (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01055                          <font class="keywordtype">int</font>         byte_order,
01056                          <font class="keywordtype">int</font>         pos,
01057                          <font class="keywordtype">int</font>        *new_pos)
01058 {
01059   <font class="keywordflow">return</font> demarshal_4_octets (str, byte_order, pos, new_pos);
01060 }
01061 
01062 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
01063 <font class="preprocessor"></font>
01073 dbus_int64_t
<a name="l01074"></a><a class="code" href="group__DBusMarshal.html#a44">01074</a> _dbus_demarshal_int64  (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01075                         <font class="keywordtype">int</font>               byte_order,
01076                         <font class="keywordtype">int</font>               pos,
01077                         <font class="keywordtype">int</font>              *new_pos)
01078 {
01079   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
01080 
01081   r = demarshal_8_octets (str, byte_order, pos, new_pos);
01082 
01083   <font class="keywordflow">return</font> r.<a class="code" href="unionDBusOctets8.html#m0">s</a>;
01084 }
01085 
01095 dbus_uint64_t
<a name="l01096"></a><a class="code" href="group__DBusMarshal.html#a45">01096</a> _dbus_demarshal_uint64  (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01097                          <font class="keywordtype">int</font>         byte_order,
01098                          <font class="keywordtype">int</font>         pos,
01099                          <font class="keywordtype">int</font>        *new_pos)
01100 {
01101   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> r;
01102 
01103   r = demarshal_8_octets (str, byte_order, pos, new_pos);
01104 
01105   <font class="keywordflow">return</font> r.<a class="code" href="unionDBusOctets8.html#m1">u</a>;
01106 }
01107 
01108 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
01109 
01120 <font class="keywordtype">void</font>
<a name="l01121"></a><a class="code" href="group__DBusMarshal.html#a46">01121</a> _dbus_demarshal_basic_type (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>      *str,
01122                             <font class="keywordtype">int</font>                    type,
01123                             <font class="keywordtype">void</font>                  *value,
01124                             <font class="keywordtype">int</font>                    byte_order,
01125                             <font class="keywordtype">int</font>                   *pos)
01126 {
01127   <font class="keyword">const</font> <font class="keywordtype">char</font> *str_data = _dbus_string_get_const_data (str);
01128 
01129   <font class="keywordflow">switch</font> (type)
01130     {
01131     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
01132     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
01133       *(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *) value = _dbus_string_get_byte (str, *pos);
01134       (*pos)++;
01135       <font class="keywordflow">break</font>;
01136     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
01137     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
01138       *pos = _DBUS_ALIGN_VALUE (*pos, 4);
01139       *(dbus_uint32_t *) value = *(dbus_uint32_t *)(str_data + *pos);
01140       <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
01141         *(dbus_uint32_t *) value = DBUS_UINT32_SWAP_LE_BE (*(dbus_uint32_t *) value);
01142       *pos += 4;
01143       <font class="keywordflow">break</font>;
01144 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
01145 <font class="preprocessor"></font>    <font class="keywordflow">case</font> DBUS_TYPE_INT64:
01146     <font class="keywordflow">case</font> DBUS_TYPE_UINT64: 
01147 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
01148     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
01149       *pos = _DBUS_ALIGN_VALUE (*pos, 8);
01150       memcpy (value, str_data + *pos, 8);
01151       <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
01152 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
01153 <font class="preprocessor"></font>        *(dbus_uint64_t *) value = DBUS_UINT64_SWAP_LE_BE (*(dbus_uint64_t *) value);
01154 <font class="preprocessor">#else   </font>
01155 <font class="preprocessor"></font>        swap_bytes (value, 8);
01156 <font class="preprocessor">#endif</font>
01157 <font class="preprocessor"></font>      *pos += 8;
01158       <font class="keywordflow">break</font>;
01159     <font class="keywordflow">default</font>:
01160       _dbus_assert_not_reached (<font class="stringliteral">"not a basic type"</font>);
01161       <font class="keywordflow">break</font>;
01162     }
01163 }
01164 
01181 <font class="keywordtype">char</font> *
<a name="l01182"></a><a class="code" href="group__DBusMarshal.html#a47">01182</a> _dbus_demarshal_string (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01183                         <font class="keywordtype">int</font>               byte_order,
01184                         <font class="keywordtype">int</font>               pos,
01185                         <font class="keywordtype">int</font>              *new_pos)
01186 {
01187   <font class="keywordtype">int</font> len;
01188   <font class="keywordtype">char</font> *retval;
01189   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
01190   
01191   len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01192 
01193   retval = dbus_malloc (len + 1);
01194 
01195   <font class="keywordflow">if</font> (!retval)
01196     <font class="keywordflow">return</font> NULL;
01197 
01198   data = _dbus_string_get_const_data_len (str, pos, len + 1);
01199 
01200   <font class="keywordflow">if</font> (!data)
01201     <font class="keywordflow">return</font> NULL;
01202 
01203   memcpy (retval, data, len + 1);
01204 
01205   <font class="keywordflow">if</font> (new_pos)
01206     *new_pos = pos + len + 1;
01207   
01208   <font class="keywordflow">return</font> retval;
01209 }
01210 
01226 dbus_bool_t
<a name="l01227"></a><a class="code" href="group__DBusMarshal.html#a48">01227</a> _dbus_demarshal_byte_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01228                             <font class="keywordtype">int</font>                byte_order,
01229                             <font class="keywordtype">int</font>                pos,
01230                             <font class="keywordtype">int</font>               *new_pos,
01231                             <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>    **array,
01232                             <font class="keywordtype">int</font>               *array_len)
01233 {
01234   <font class="keywordtype">int</font> len;
01235   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *retval;
01236   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
01237 
01238   len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01239 
01240   <font class="keywordflow">if</font> (len == 0)
01241     {
01242       *array_len = len;
01243       *array = NULL;
01244 
01245       <font class="keywordflow">if</font> (new_pos)
01246         *new_pos = pos;
01247       
01248       <font class="keywordflow">return</font> TRUE;
01249     }
01250   
01251   retval = dbus_malloc (len);
01252 
01253   <font class="keywordflow">if</font> (!retval)
01254     <font class="keywordflow">return</font> FALSE;
01255 
01256   data = _dbus_string_get_const_data_len (str, pos, len);
01257 
01258   <font class="keywordflow">if</font> (!data)
01259     {
01260       dbus_free (retval);
01261       <font class="keywordflow">return</font> FALSE;
01262     }
01263 
01264   memcpy (retval, data, len);
01265 
01266   <font class="keywordflow">if</font> (new_pos)
01267     *new_pos = pos + len;
01268 
01269   *array = retval;
01270   *array_len = len;
01271   
01272   <font class="keywordflow">return</font> TRUE;
01273 }
01274 
01275 <font class="keyword">static</font> dbus_bool_t
01276 demarshal_4_octets_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01277                           <font class="keywordtype">int</font>                byte_order,
01278                           <font class="keywordtype">int</font>                pos,
01279                           <font class="keywordtype">int</font>               *new_pos,
01280                           dbus_uint32_t    **array,
01281                           <font class="keywordtype">int</font>               *array_len)
01282 {
01283   <font class="keywordtype">int</font> len, i;
01284   dbus_uint32_t *retval;
01285   <font class="keywordtype">int</font> byte_len;
01286   
01287   byte_len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01288   len = byte_len / 4;
01289 
01290   <font class="keywordflow">if</font> (len == 0)
01291     {
01292       *array_len = 0;
01293       *array = NULL;
01294 
01295       <font class="keywordflow">if</font> (new_pos)
01296         *new_pos = pos;
01297       
01298       <font class="keywordflow">return</font> TRUE;
01299     }
01300 
01301   <font class="keywordflow">if</font> (!_dbus_string_copy_data_len (str, (<font class="keywordtype">char</font>**) &amp;retval,
01302                                    pos, byte_len))
01303     <font class="keywordflow">return</font> FALSE;
01304   
01305   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
01306     {
01307       <font class="keywordflow">for</font> (i = 0; i &lt; len; i++)
01308         retval[i] = DBUS_UINT32_SWAP_LE_BE (retval[i]);
01309     }
01310 
01311   <font class="keywordflow">if</font> (new_pos)
01312     *new_pos = pos + byte_len;
01313 
01314   *array_len = len;
01315   *array = retval;
01316   
01317   <font class="keywordflow">return</font> TRUE;  
01318 }
01319 
01320 <font class="keyword">static</font> dbus_bool_t
01321 demarshal_8_octets_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01322                           <font class="keywordtype">int</font>                byte_order,
01323                           <font class="keywordtype">int</font>                pos,
01324                           <font class="keywordtype">int</font>               *new_pos,
01325                           <a class="code" href="unionDBusOctets8.html">DBusOctets8</a>      **array,
01326                           <font class="keywordtype">int</font>               *array_len)
01327 {
01328   <font class="keywordtype">int</font> len, i;
01329   <a class="code" href="unionDBusOctets8.html">DBusOctets8</a> *retval;
01330   <font class="keywordtype">int</font> byte_len;
01331   
01332   byte_len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01333   len = byte_len / 8;
01334 
01335   <font class="keywordflow">if</font> (len == 0)
01336     {
01337       *array_len = 0;
01338       *array = NULL;
01339 
01340       <font class="keywordflow">if</font> (new_pos)
01341         *new_pos = pos;
01342       
01343       <font class="keywordflow">return</font> TRUE;
01344     }
01345 
01346   <font class="keywordflow">if</font> (!_dbus_string_copy_data_len (str, (<font class="keywordtype">char</font>**) &amp;retval,
01347                                    pos, byte_len))
01348     <font class="keywordflow">return</font> FALSE;
01349   
01350   <font class="keywordflow">if</font> (byte_order != DBUS_COMPILER_BYTE_ORDER)
01351     {
01352       <font class="keywordflow">for</font> (i = 0; i &lt; len; i++)
01353         {
01354 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
01355 <font class="preprocessor"></font>          retval[i].<a class="code" href="unionDBusOctets8.html#m1">u</a> = DBUS_UINT64_SWAP_LE_BE (retval[i].u);
01356 <font class="preprocessor">#else</font>
01357 <font class="preprocessor"></font>          swap_bytes ((<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *) &amp;retval[i], 8);
01358 <font class="preprocessor">#endif</font>
01359 <font class="preprocessor"></font>        }
01360     }
01361 
01362   <font class="keywordflow">if</font> (new_pos)
01363     *new_pos = pos + byte_len;
01364 
01365   *array_len = len;
01366   *array = retval;
01367   
01368   <font class="keywordflow">return</font> TRUE;  
01369 }
01370 
01382 dbus_bool_t
<a name="l01383"></a><a class="code" href="group__DBusMarshal.html#a51">01383</a> _dbus_demarshal_int32_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01384                              <font class="keywordtype">int</font>                byte_order,
01385                              <font class="keywordtype">int</font>                pos,
01386                              <font class="keywordtype">int</font>               *new_pos,
01387                              dbus_int32_t     **array,
01388                              <font class="keywordtype">int</font>               *array_len)
01389 {
01390   <font class="keywordflow">return</font> demarshal_4_octets_array (str, byte_order, pos, new_pos,
01391                                    (dbus_uint32_t**) array, array_len);
01392 }
01393 
01405 dbus_bool_t
<a name="l01406"></a><a class="code" href="group__DBusMarshal.html#a52">01406</a> _dbus_demarshal_uint32_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01407                               <font class="keywordtype">int</font>                byte_order,
01408                               <font class="keywordtype">int</font>                pos,
01409                               <font class="keywordtype">int</font>               *new_pos,
01410                               dbus_uint32_t    **array,
01411                               <font class="keywordtype">int</font>               *array_len)
01412 {
01413   <font class="keywordflow">return</font> demarshal_4_octets_array (str, byte_order, pos, new_pos,
01414                                    array, array_len);
01415 }
01416 
01417 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
01418 <font class="preprocessor"></font>
01430 dbus_bool_t
<a name="l01431"></a><a class="code" href="group__DBusMarshal.html#a53">01431</a> _dbus_demarshal_int64_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01432                              <font class="keywordtype">int</font>                byte_order,
01433                              <font class="keywordtype">int</font>                pos,
01434                              <font class="keywordtype">int</font>               *new_pos,
01435                              dbus_int64_t     **array,
01436                              <font class="keywordtype">int</font>               *array_len)
01437 {
01438   <font class="keywordflow">return</font> demarshal_8_octets_array (str, byte_order, pos, new_pos,
01439                                    (<a class="code" href="unionDBusOctets8.html">DBusOctets8</a>**) array, array_len);
01440 }
01441 
01453 dbus_bool_t
<a name="l01454"></a><a class="code" href="group__DBusMarshal.html#a54">01454</a> _dbus_demarshal_uint64_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01455                               <font class="keywordtype">int</font>                byte_order,
01456                               <font class="keywordtype">int</font>                pos,
01457                               <font class="keywordtype">int</font>               *new_pos,
01458                               dbus_uint64_t    **array,
01459                               <font class="keywordtype">int</font>               *array_len)
01460 {
01461   <font class="keywordflow">return</font> demarshal_8_octets_array (str, byte_order, pos, new_pos,
01462                                    (<a class="code" href="unionDBusOctets8.html">DBusOctets8</a>**) array, array_len);
01463 }
01464 
01465 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
01466 
01478 dbus_bool_t
<a name="l01479"></a><a class="code" href="group__DBusMarshal.html#a55">01479</a> _dbus_demarshal_double_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>  *str,
01480                               <font class="keywordtype">int</font>                byte_order,
01481                               <font class="keywordtype">int</font>                pos,
01482                               <font class="keywordtype">int</font>               *new_pos,
01483                               <font class="keywordtype">double</font>           **array,
01484                               <font class="keywordtype">int</font>               *array_len)
01485 {
01486   <font class="keywordflow">return</font> demarshal_8_octets_array (str, byte_order, pos, new_pos,
01487                                    (<a class="code" href="unionDBusOctets8.html">DBusOctets8</a>**) array, array_len);
01488 }
01489 
01490 
01502 dbus_bool_t
<a name="l01503"></a><a class="code" href="group__DBusMarshal.html#a56">01503</a> _dbus_demarshal_basic_type_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>      *str,
01504                                   <font class="keywordtype">int</font>                    element_type,
01505                                   <font class="keywordtype">void</font>                 **array,
01506                                   <font class="keywordtype">int</font>                   *array_len,
01507                                   <font class="keywordtype">int</font>                    byte_order,
01508                                   <font class="keywordtype">int</font>                   *pos)
01509 {
01510   <font class="keywordflow">switch</font> (element_type)
01511     {
01512     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
01513       <font class="comment">/* FIXME: do we want to post-normalize these ? */</font>
01514     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
01515       <font class="keywordflow">return</font> _dbus_demarshal_byte_array (str, byte_order, *pos, pos,
01516                                          (<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> **)array, array_len);
01517       <font class="keywordflow">break</font>;
01518     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
01519     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
01520       <font class="keywordflow">return</font> demarshal_4_octets_array (str, byte_order, *pos, pos,
01521                                        (dbus_uint32_t **)array, array_len);
01522       <font class="keywordflow">break</font>;
01523 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
01524 <font class="preprocessor"></font>    <font class="keywordflow">case</font> DBUS_TYPE_INT64:
01525     <font class="keywordflow">case</font> DBUS_TYPE_UINT64: 
01526 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
01527     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
01528       <font class="keywordflow">return</font> demarshal_8_octets_array (str, byte_order, *pos, pos,
01529                                        (<a class="code" href="unionDBusOctets8.html">DBusOctets8</a>**) array, array_len);
01530     <font class="keywordflow">default</font>:
01531       _dbus_assert_not_reached (<font class="stringliteral">"not a basic type"</font>);
01532       <font class="keywordflow">break</font>;
01533     }
01534   <font class="keywordflow">return</font> FALSE;
01535 }
01536 
01548 dbus_bool_t
<a name="l01549"></a><a class="code" href="group__DBusMarshal.html#a57">01549</a> _dbus_demarshal_string_array (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>   *str,
01550                               <font class="keywordtype">int</font>                 byte_order,
01551                               <font class="keywordtype">int</font>                 pos,
01552                               <font class="keywordtype">int</font>                *new_pos,
01553                               <font class="keywordtype">char</font>             ***array,
01554                               <font class="keywordtype">int</font>                *array_len)
01555 {
01556   <font class="keywordtype">int</font> bytes_len, i;
01557   <font class="keywordtype">int</font> len, allocated;
01558   <font class="keywordtype">int</font> end_pos;
01559   <font class="keywordtype">char</font> **retval;
01560   
01561   bytes_len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01562   
01563   <font class="keywordflow">if</font> (bytes_len == 0)
01564     {
01565       *array_len = 0;
01566       *array = NULL;
01567 
01568       <font class="keywordflow">if</font> (new_pos)
01569         *new_pos = pos;
01570       
01571       <font class="keywordflow">return</font> TRUE;
01572     }
01573 
01574   len = 0;
01575   allocated = 4;
01576   end_pos = pos + bytes_len;
01577   
01578   retval = dbus_new (<font class="keywordtype">char</font> *, allocated);
01579 
01580   <font class="keywordflow">if</font> (!retval)
01581     <font class="keywordflow">return</font> FALSE;
01582 
01583   <font class="keywordflow">while</font> (pos &lt; end_pos)
01584     {
01585       retval[len] = _dbus_demarshal_string (str, byte_order, pos, &amp;pos);
01586       
01587       <font class="keywordflow">if</font> (retval[len] == NULL)
01588         <font class="keywordflow">goto</font> error;
01589       
01590       len += 1;
01591 
01592       <font class="keywordflow">if</font> (len &gt;= allocated - 1) <font class="comment">/* -1 for NULL termination */</font>
01593         {
01594           <font class="keywordtype">char</font> **newp;
01595           newp = dbus_realloc (retval,
01596                                <font class="keyword">sizeof</font> (<font class="keywordtype">char</font>*) * allocated * 2);
01597           <font class="keywordflow">if</font> (newp == NULL)
01598             <font class="keywordflow">goto</font> error;
01599 
01600           allocated *= 2;
01601           retval = newp;
01602         }
01603     }
01604       
01605   retval[len] = NULL;
01606 
01607   <font class="keywordflow">if</font> (new_pos)
01608     *new_pos = pos;
01609   
01610   *array = retval;
01611   *array_len = len;
01612   
01613   <font class="keywordflow">return</font> TRUE;
01614 
01615  error:
01616   <font class="keywordflow">for</font> (i = 0; i &lt; len; i++)
01617     dbus_free (retval[i]);
01618   dbus_free (retval);
01619 
01620   <font class="keywordflow">return</font> FALSE;
01621 }
01622 
<a name="l01624"></a><a class="code" href="group__DBusMarshal.html#a71">01624</a> <font class="preprocessor">#define VERBOSE_DECOMPOSE 0</font>
01625 <font class="preprocessor"></font>
01635 dbus_bool_t
<a name="l01636"></a><a class="code" href="group__DBusMarshal.html#a58">01636</a> _dbus_decompose_path (<font class="keyword">const</font> <font class="keywordtype">char</font>*     data,
01637                       <font class="keywordtype">int</font>             len,
01638                       <font class="keywordtype">char</font>         ***path,
01639                       <font class="keywordtype">int</font>            *path_len)
01640 {
01641   <font class="keywordtype">char</font> **retval;
01642   <font class="keywordtype">int</font> n_components;
01643   <font class="keywordtype">int</font> i, j, comp;
01644 
01645   _dbus_assert (data != NULL);
01646 
01647 <font class="preprocessor">#if VERBOSE_DECOMPOSE</font>
01648 <font class="preprocessor"></font>  _dbus_verbose (<font class="stringliteral">"Decomposing path \"%s\"\n"</font>,
01649                  data);
01650 <font class="preprocessor">#endif</font>
01651 <font class="preprocessor"></font>  
01652   n_components = 0;
01653   i = 0;
01654   <font class="keywordflow">while</font> (i &lt; len)
01655     {
01656       <font class="keywordflow">if</font> (data[i] == <font class="charliteral">'/'</font>)
01657         n_components += 1;
01658       ++i;
01659     }
01660   
01661   retval = dbus_new0 (<font class="keywordtype">char</font>*, n_components + 1);
01662 
01663   <font class="keywordflow">if</font> (retval == NULL)
01664     <font class="keywordflow">return</font> FALSE;
01665 
01666   comp = 0;
01667   i = 0;
01668   <font class="keywordflow">while</font> (i &lt; len)
01669     {
01670       <font class="keywordflow">if</font> (data[i] == <font class="charliteral">'/'</font>)
01671         ++i;
01672       j = i;
01673 
01674       <font class="keywordflow">while</font> (j &lt; len &amp;&amp; data[j] != <font class="charliteral">'/'</font>)
01675         ++j;
01676 
01677       <font class="comment">/* Now [i, j) is the path component */</font>
01678       _dbus_assert (i &lt; j);
01679       _dbus_assert (data[i] != <font class="charliteral">'/'</font>);
01680       _dbus_assert (j == len || data[j] == <font class="charliteral">'/'</font>);
01681 
01682 <font class="preprocessor">#if VERBOSE_DECOMPOSE</font>
01683 <font class="preprocessor"></font>      _dbus_verbose (<font class="stringliteral">"  (component in [%d,%d))\n"</font>,
01684                      i, j);
01685 <font class="preprocessor">#endif</font>
01686 <font class="preprocessor"></font>      
01687       retval[comp] = _dbus_memdup (&amp;data[i], j - i + 1);
01688       <font class="keywordflow">if</font> (retval[comp] == NULL)
01689         {
01690           dbus_free_string_array (retval);
01691           <font class="keywordflow">return</font> FALSE;
01692         }
01693       retval[comp][j-i] = <font class="charliteral">'\0'</font>;
01694 <font class="preprocessor">#if VERBOSE_DECOMPOSE</font>
01695 <font class="preprocessor"></font>      _dbus_verbose (<font class="stringliteral">"  (component %d = \"%s\")\n"</font>,
01696                      comp, retval[comp]);
01697 <font class="preprocessor">#endif</font>
01698 <font class="preprocessor"></font>
01699       ++comp;
01700       i = j;
01701     }
01702   _dbus_assert (i == len);
01703   
01704   *path = retval;
01705   <font class="keywordflow">if</font> (path_len)
01706     *path_len = n_components;
01707   
01708   <font class="keywordflow">return</font> TRUE;
01709 }
01710 
01722 dbus_bool_t
<a name="l01723"></a><a class="code" href="group__DBusMarshal.html#a59">01723</a> _dbus_demarshal_object_path (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01724                              <font class="keywordtype">int</font>               byte_order,
01725                              <font class="keywordtype">int</font>               pos,
01726                              <font class="keywordtype">int</font>              *new_pos,
01727                              <font class="keywordtype">char</font>           ***path,
01728                              <font class="keywordtype">int</font>              *path_len)
01729 {
01730   <font class="keywordtype">int</font> len;
01731   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
01732   
01733   len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01734   data = _dbus_string_get_const_data_len (str, pos, len + 1);
01735 
01736   <font class="keywordflow">if</font> (!_dbus_decompose_path (data, len, path, path_len))
01737     <font class="keywordflow">return</font> FALSE;
01738 
01739   <font class="keywordflow">if</font> (new_pos)
01740     *new_pos = pos + len + 1;
01741 
01742   <font class="keywordflow">return</font> TRUE;
01743 }
01744 
01758 dbus_bool_t
<a name="l01759"></a><a class="code" href="group__DBusMarshal.html#a60">01759</a> _dbus_marshal_get_arg_end_pos (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01760                                <font class="keywordtype">int</font>               byte_order,
01761                                <font class="keywordtype">int</font>               type,
01762                                <font class="keywordtype">int</font>               pos,
01763                                <font class="keywordtype">int</font>              *end_pos)
01764 {
01765   <font class="keywordflow">if</font> (pos &gt;= _dbus_string_get_length (str))
01766     <font class="keywordflow">return</font> FALSE;
01767 
01768   <font class="keywordflow">switch</font> (type)
01769     {
01770     <font class="keywordflow">case</font> DBUS_TYPE_INVALID:
01771       <font class="keywordflow">return</font> FALSE;
01772       <font class="keywordflow">break</font>;
01773 
01774     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
01775       *end_pos = pos;
01776       <font class="keywordflow">break</font>;
01777 
01778     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
01779       *end_pos = pos + 1;
01780       <font class="keywordflow">break</font>;
01781       
01782     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
01783       *end_pos = pos + 1;
01784       <font class="keywordflow">break</font>;
01785 
01786     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
01787     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
01788       *end_pos = _DBUS_ALIGN_VALUE (pos, 4) + 4;
01789       <font class="keywordflow">break</font>;
01790 
01791     <font class="keywordflow">case</font> DBUS_TYPE_INT64:
01792     <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
01793     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
01794       
01795       *end_pos = _DBUS_ALIGN_VALUE (pos, 8) + 8;
01796       <font class="keywordflow">break</font>;
01797 
01798     <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
01799     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
01800       {
01801         <font class="keywordtype">int</font> len;
01802         
01803         <font class="comment">/* Demarshal the length */</font>
01804         len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01805 
01806         *end_pos = pos + len + 1;
01807       }
01808       <font class="keywordflow">break</font>;
01809 
01810     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
01811       {
01812         <font class="keywordtype">int</font> len;
01813         
01814         <font class="comment">/* Demarshal the string length */</font>
01815         len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01816 
01817         pos += len + 1;
01818         
01819         <font class="comment">/* Demarshal the data length */</font>
01820         len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01821 
01822         *end_pos = pos + len;
01823       }
01824       <font class="keywordflow">break</font>;
01825       
01826     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
01827       {
01828         <font class="keywordtype">int</font> len;
01829 
01830         <font class="comment">/* Demarshal the length  */</font>
01831         len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01832         
01833         *end_pos = pos + len;
01834       }
01835       <font class="keywordflow">break</font>;
01836 
01837     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
01838       {
01839         <font class="keywordtype">int</font> len;
01840 
01841         <font class="comment">/* Demarshal the length */</font>
01842         len = _dbus_demarshal_uint32 (str, byte_order, pos, &amp;pos);
01843         
01844         *end_pos = pos + len;
01845       }
01846       <font class="keywordflow">break</font>;
01847       
01848     <font class="keywordflow">default</font>:
01849       _dbus_warn (<font class="stringliteral">"Unknown message arg type %d\n"</font>, type);
01850       _dbus_assert_not_reached (<font class="stringliteral">"Unknown message argument type\n"</font>);
01851       <font class="keywordflow">return</font> FALSE;
01852     }
01853 
01854   <font class="keywordflow">if</font> (*end_pos &gt; _dbus_string_get_length (str))
01855     <font class="keywordflow">return</font> FALSE;
01856   
01857   <font class="keywordflow">return</font> TRUE;
01858 }
01859 
01873 <font class="keyword">static</font> <font class="keywordtype">int</font>
01874 demarshal_and_validate_len (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01875                             <font class="keywordtype">int</font>               byte_order,
01876                             <font class="keywordtype">int</font>               pos,
01877                             <font class="keywordtype">int</font>              *new_pos)
01878 {
01879   <font class="keywordtype">int</font> align_4 = _DBUS_ALIGN_VALUE (pos, 4);
01880   <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> len;
01881 
01882   _dbus_assert (new_pos != NULL);
01883   
01884   <font class="keywordflow">if</font> ((align_4 + 4) &gt; _dbus_string_get_length (str))
01885     {
01886       _dbus_verbose (<font class="stringliteral">"not enough room in message for array length\n"</font>);
01887       <font class="keywordflow">return</font> -1;
01888     }
01889   
01890   <font class="keywordflow">if</font> (!_dbus_string_validate_nul (str, pos,
01891                                   align_4 - pos))
01892     {
01893       _dbus_verbose (<font class="stringliteral">"array length alignment padding not initialized to nul at %d\n"</font>, pos);
01894       <font class="keywordflow">return</font> -1;
01895     }
01896 
01897   len = _dbus_demarshal_uint32 (str, byte_order, align_4, new_pos);
01898 
01899   <font class="comment">/* note that the len is the number of bytes, so we need it to be</font>
01900 <font class="comment">   * at least SIZE_T_MAX, but make it smaller just to keep things</font>
01901 <font class="comment">   * sane.  We end up using ints for most sizes to avoid unsigned mess</font>
01902 <font class="comment">   * so limit to maximum 32-bit signed int divided by at least 8, more</font>
01903 <font class="comment">   * for a bit of paranoia margin. INT_MAX/32 is about 65 megabytes.</font>
01904 <font class="comment">   */</font>  
01905 <font class="preprocessor">#define MAX_ARRAY_LENGTH (((unsigned int)_DBUS_INT_MAX) / 32)</font>
01906 <font class="preprocessor"></font>  <font class="keywordflow">if</font> (len &gt; MAX_ARRAY_LENGTH)
01907     {
01908       _dbus_verbose (<font class="stringliteral">"array length %u exceeds maximum of %u at pos %d\n"</font>,
01909                      len, MAX_ARRAY_LENGTH, pos);
01910       <font class="keywordflow">return</font> -1;
01911     }
01912   <font class="keywordflow">else</font>
01913     <font class="keywordflow">return</font> (int) len;
01914 }
01915 
01916 <font class="keyword">static</font> dbus_bool_t
01917 validate_string (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01918                  <font class="keywordtype">int</font>               pos,
01919                  <font class="keywordtype">int</font>               len_without_nul,
01920                  <font class="keywordtype">int</font>              *end_pos)
01921 {
01922   *end_pos = pos + len_without_nul + 1;
01923   
01924   <font class="keywordflow">if</font> (*end_pos &gt; _dbus_string_get_length (str))
01925     {
01926       _dbus_verbose (<font class="stringliteral">"string length outside length of the message\n"</font>);
01927       <font class="keywordflow">return</font> FALSE;
01928     }
01929   
01930   <font class="keywordflow">if</font> (_dbus_string_get_byte (str, pos + len_without_nul) != <font class="charliteral">'\0'</font>)
01931     {
01932       _dbus_verbose (<font class="stringliteral">"string arg not nul-terminated\n"</font>);
01933       <font class="keywordflow">return</font> FALSE;
01934     }
01935   
01936   <font class="keywordflow">if</font> (!_dbus_string_validate_utf8 (str, pos, len_without_nul))
01937     {
01938       _dbus_verbose (<font class="stringliteral">"string is not valid UTF-8\n"</font>);
01939       <font class="keywordflow">return</font> FALSE;
01940     }
01941 
01942   <font class="keywordflow">return</font> TRUE;
01943 }   
01944 
01956 dbus_bool_t
<a name="l01957"></a><a class="code" href="group__DBusMarshal.html#a63">01957</a> _dbus_marshal_validate_type   (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01958                                <font class="keywordtype">int</font>               pos,
01959                                <font class="keywordtype">int</font>              *type,
01960                                <font class="keywordtype">int</font>              *end_pos)
01961 {
01962   <font class="keyword">const</font> <font class="keywordtype">char</font> *data;
01963   
01964   <font class="keywordflow">if</font> (pos &gt;= _dbus_string_get_length (str))
01965     <font class="keywordflow">return</font> FALSE;
01966 
01967   data = _dbus_string_get_const_data_len (str, pos, 1);
01968 
01969   <font class="keywordflow">if</font> (_dbus_type_is_valid (*data))
01970     {
01971       *type = *data;
01972       <font class="keywordflow">if</font> (end_pos != NULL)
01973         *end_pos = pos + 1;
01974       <font class="keywordflow">return</font> TRUE;
01975     }
01976 
01977   _dbus_verbose (<font class="stringliteral">"'%c' %d invalid type code\n"</font>, (<font class="keywordtype">int</font>) *data, (<font class="keywordtype">int</font>) *data);
01978   
01979   <font class="keywordflow">return</font> FALSE;
01980 }
01981 
01982 <font class="comment">/* Faster validator for array data that doesn't call</font>
01983 <font class="comment"> * validate_arg for each value</font>
01984 <font class="comment"> */</font>
01985 <font class="keyword">static</font> dbus_bool_t
01986 validate_array_data (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
01987                      <font class="keywordtype">int</font>               byte_order,
01988                      <font class="keywordtype">int</font>               depth,
01989                      <font class="keywordtype">int</font>               type,
01990                      <font class="keywordtype">int</font>               array_type_pos,
01991                      <font class="keywordtype">int</font>               pos,
01992                      <font class="keywordtype">int</font>              *new_pos,
01993                      <font class="keywordtype">int</font>               end)
01994 {
01995   <font class="keywordflow">switch</font> (type)
01996     {
01997     <font class="keywordflow">case</font> DBUS_TYPE_INVALID:
01998       <font class="keywordflow">return</font> FALSE;
01999       <font class="keywordflow">break</font>;
02000 
02001     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
02002       <font class="keywordflow">break</font>;
02003 
02004     <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
02005     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
02006     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
02007     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
02008     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
02009       <font class="comment">/* This clean recursion to validate_arg is what we</font>
02010 <font class="comment">       * are doing logically for all types, but we don't</font>
02011 <font class="comment">       * really want to call validate_arg for every byte</font>
02012 <font class="comment">       * in a byte array, so the primitive types are</font>
02013 <font class="comment">       * special-cased.</font>
02014 <font class="comment">       */</font>
02015       <font class="keywordflow">while</font> (pos &lt; end)
02016         {
02017           <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (str, byte_order, depth,
02018                                            type, array_type_pos, pos, &amp;pos))
02019             <font class="keywordflow">return</font> FALSE;
02020         }
02021       <font class="keywordflow">break</font>;
02022       
02023     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02024       pos = end;
02025       <font class="keywordflow">break</font>;
02026       
02027     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02028       <font class="keywordflow">while</font> (pos &lt; end)
02029         {
02030           <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> c;
02031           
02032           c = _dbus_string_get_byte (str, pos);
02033           
02034           <font class="keywordflow">if</font> (!(c == 0 || c == 1))
02035             {
02036               _dbus_verbose (<font class="stringliteral">"boolean value must be either 0 or 1, not %d\n"</font>, c);
02037               <font class="keywordflow">return</font> FALSE;
02038             }
02039           
02040           ++pos;
02041         }
02042       <font class="keywordflow">break</font>;
02043       
02044     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02045     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02046       <font class="comment">/* Call validate arg one time to check alignment padding</font>
02047 <font class="comment">       * at start of array</font>
02048 <font class="comment">       */</font>
02049       <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (str, byte_order, depth,
02050                                        type, array_type_pos, pos, &amp;pos))
02051         <font class="keywordflow">return</font> FALSE;
02052       pos = _DBUS_ALIGN_VALUE (end, 4);
02053       <font class="keywordflow">break</font>;
02054 
02055     <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02056     <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
02057     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02058       <font class="comment">/* Call validate arg one time to check alignment padding</font>
02059 <font class="comment">       * at start of array</font>
02060 <font class="comment">       */</font>
02061       <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (str, byte_order, depth,
02062                                        type, array_type_pos, pos, &amp;pos))
02063         <font class="keywordflow">return</font> FALSE;
02064       pos = _DBUS_ALIGN_VALUE (end, 8);
02065       <font class="keywordflow">break</font>;
02066       
02067     <font class="keywordflow">default</font>:
02068       _dbus_verbose (<font class="stringliteral">"Unknown message arg type %d\n"</font>, type);
02069       <font class="keywordflow">return</font> FALSE;
02070     }
02071 
02072   *new_pos = pos;
02073 
02074   <font class="keywordflow">return</font> TRUE;
02075 }
02076 
02097 dbus_bool_t
<a name="l02098"></a><a class="code" href="group__DBusMarshal.html#a65">02098</a> _dbus_marshal_validate_arg (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
02099                             <font class="keywordtype">int</font>               byte_order,
02100                             <font class="keywordtype">int</font>               depth,
02101                             <font class="keywordtype">int</font>               type,
02102                             <font class="keywordtype">int</font>               array_type_pos,
02103                             <font class="keywordtype">int</font>               pos,
02104                             <font class="keywordtype">int</font>              *end_pos)
02105 {
02106   <font class="keywordflow">if</font> (pos &gt; _dbus_string_get_length (str))
02107     {
02108       _dbus_verbose (<font class="stringliteral">"Validation went off the end of the message\n"</font>);
02109       <font class="keywordflow">return</font> FALSE;
02110     }
02111 
02112 <font class="preprocessor">#define MAX_VALIDATION_DEPTH 32</font>
02113 <font class="preprocessor"></font>  
02114   <font class="keywordflow">if</font> (depth &gt; MAX_VALIDATION_DEPTH)
02115     {
02116       _dbus_verbose (<font class="stringliteral">"Maximum recursion depth reached validating message\n"</font>);
02117       <font class="keywordflow">return</font> FALSE;
02118     }
02119   
02120   <font class="keywordflow">switch</font> (type)
02121     {
02122     <font class="keywordflow">case</font> DBUS_TYPE_INVALID:
02123       <font class="keywordflow">return</font> FALSE;
02124       <font class="keywordflow">break</font>;
02125 
02126     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
02127       *end_pos = pos;
02128       <font class="keywordflow">break</font>;
02129 
02130     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02131       <font class="keywordflow">if</font> (1 &gt; _dbus_string_get_length (str) - pos)
02132         {
02133           _dbus_verbose (<font class="stringliteral">"no room for byte value\n"</font>);
02134           <font class="keywordflow">return</font> FALSE;
02135         }
02136         
02137       *end_pos = pos + 1;
02138       <font class="keywordflow">break</font>;
02139       
02140     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02141       {
02142         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> c;
02143 
02144         <font class="keywordflow">if</font> (1 &gt; _dbus_string_get_length (str) - pos)
02145           {
02146             _dbus_verbose (<font class="stringliteral">"no room for boolean value\n"</font>);
02147             <font class="keywordflow">return</font> FALSE;
02148           }
02149         
02150         c = _dbus_string_get_byte (str, pos);
02151 
02152         <font class="keywordflow">if</font> (!(c == 0 || c == 1))
02153           {
02154             _dbus_verbose (<font class="stringliteral">"boolean value must be either 0 or 1, not %d\n"</font>, c);
02155             <font class="keywordflow">return</font> FALSE;
02156           }
02157         
02158         *end_pos = pos + 1;
02159       }
02160       <font class="keywordflow">break</font>;
02161       
02162     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02163     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02164       {
02165         <font class="keywordtype">int</font> align_4 = _DBUS_ALIGN_VALUE (pos, 4);
02166         
02167         <font class="keywordflow">if</font> (!_dbus_string_validate_nul (str, pos,
02168                                         align_4 - pos))
02169           {
02170             _dbus_verbose (<font class="stringliteral">"int32/uint32 alignment padding not initialized to nul\n"</font>);
02171             <font class="keywordflow">return</font> FALSE;
02172           }
02173 
02174         *end_pos = align_4 + 4;
02175       }
02176       <font class="keywordflow">break</font>;
02177 
02178     <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02179     <font class="keywordflow">case</font> DBUS_TYPE_UINT64:      
02180     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02181       {
02182         <font class="keywordtype">int</font> align_8 = _DBUS_ALIGN_VALUE (pos, 8);
02183 
02184         _dbus_verbose_bytes_of_string (str, pos, (align_8 + 8 - pos));
02185         
02186         <font class="keywordflow">if</font> (!_dbus_string_validate_nul (str, pos,
02187                                         align_8 - pos))
02188           {
02189             _dbus_verbose (<font class="stringliteral">"double/int64/uint64/objid alignment padding not initialized to nul at %d\n"</font>, pos);
02190             <font class="keywordflow">return</font> FALSE;
02191           }
02192 
02193         *end_pos = align_8 + 8;
02194       }
02195       <font class="keywordflow">break</font>;
02196 
02197     <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
02198     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
02199       {
02200         <font class="keywordtype">int</font> len;
02201 
02202         <font class="comment">/* Demarshal the length, which does NOT include</font>
02203 <font class="comment">         * nul termination</font>
02204 <font class="comment">         */</font>
02205         len = demarshal_and_validate_len (str, byte_order, pos, &amp;pos);
02206         <font class="keywordflow">if</font> (len &lt; 0)
02207           <font class="keywordflow">return</font> FALSE;
02208 
02209         <font class="keywordflow">if</font> (!validate_string (str, pos, len, end_pos))
02210           <font class="keywordflow">return</font> FALSE;
02211 
02212         <font class="keywordflow">if</font> (type == DBUS_TYPE_OBJECT_PATH)
02213           {
02214             <font class="keywordflow">if</font> (!_dbus_string_validate_path (str, pos, len))
02215               <font class="keywordflow">return</font> FALSE;
02216           }
02217       }
02218       <font class="keywordflow">break</font>;
02219 
02220     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
02221       {
02222         <font class="keywordtype">int</font> len;
02223 
02224         <font class="comment">/* Demarshal the string length, which does NOT include</font>
02225 <font class="comment">         * nul termination</font>
02226 <font class="comment">         */</font>
02227         len = demarshal_and_validate_len (str, byte_order, pos, &amp;pos);
02228         <font class="keywordflow">if</font> (len &lt; 0)
02229           <font class="keywordflow">return</font> FALSE;
02230 
02231         <font class="keywordflow">if</font> (!validate_string (str, pos, len, &amp;pos))
02232           <font class="keywordflow">return</font> FALSE;
02233 
02234         <font class="comment">/* Validate data */</font>
02235         len = demarshal_and_validate_len (str, byte_order, pos, &amp;pos);
02236         <font class="keywordflow">if</font> (len &lt; 0)
02237           <font class="keywordflow">return</font> FALSE;
02238 
02239         *end_pos = pos + len;
02240       }
02241       <font class="keywordflow">break</font>;
02242       
02243     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
02244       {
02245         <font class="keywordtype">int</font> len;
02246         <font class="keywordtype">int</font> end;
02247         <font class="keywordtype">int</font> array_type;
02248 
02249         <font class="keywordflow">if</font> (array_type_pos == -1)
02250           {
02251             array_type_pos = pos;
02252 
02253             <font class="keywordflow">do</font>
02254               {
02255                 <font class="keywordflow">if</font> (!_dbus_marshal_validate_type (str, pos, &amp;array_type, &amp;pos))
02256                   {
02257                     _dbus_verbose (<font class="stringliteral">"invalid array type\n"</font>);
02258                     <font class="keywordflow">return</font> FALSE;
02259                   }
02260                 
02261                 <font class="comment">/* NIL values take up no space, so you couldn't iterate over an array of them.</font>
02262 <font class="comment">                 * array of nil seems useless anyway; the useful thing might be array of</font>
02263 <font class="comment">                 * (nil OR string) but we have no framework for that.</font>
02264 <font class="comment">                 */</font>
02265                 <font class="keywordflow">if</font> (array_type == DBUS_TYPE_NIL)
02266                   {
02267                     _dbus_verbose (<font class="stringliteral">"array of NIL is not allowed\n"</font>);
02268                     <font class="keywordflow">return</font> FALSE;
02269                   }
02270               }
02271             <font class="keywordflow">while</font> (array_type == DBUS_TYPE_ARRAY);
02272           }
02273         <font class="keywordflow">else</font>
02274           array_type_pos++;
02275 
02276         <font class="keywordflow">if</font> (!_dbus_marshal_validate_type (str, array_type_pos, &amp;array_type, NULL))
02277           {
02278             _dbus_verbose (<font class="stringliteral">"invalid array type\n"</font>);
02279             <font class="keywordflow">return</font> FALSE;
02280           }
02281         
02282         len = demarshal_and_validate_len (str, byte_order, pos, &amp;pos);
02283         <font class="keywordflow">if</font> (len &lt; 0)
02284           {
02285             _dbus_verbose (<font class="stringliteral">"invalid array length (&lt;0)\n"</font>);
02286             <font class="keywordflow">return</font> FALSE;
02287           }
02288 
02289         <font class="keywordflow">if</font> (len &gt; _dbus_string_get_length (str) - pos)
02290           {
02291             _dbus_verbose (<font class="stringliteral">"array length outside length of the message\n"</font>);
02292             <font class="keywordflow">return</font> FALSE;
02293           }
02294         
02295         end = pos + len;
02296 
02297         <font class="keywordflow">if</font> (len &gt; 0 &amp;&amp; !validate_array_data (str, byte_order, depth + 1,
02298                                              array_type, array_type_pos,
02299                                              pos, &amp;pos, end))
02300           {
02301             _dbus_verbose (<font class="stringliteral">"invalid array data\n"</font>);
02302             <font class="keywordflow">return</font> FALSE;
02303           }
02304 
02305         <font class="keywordflow">if</font> (pos &lt; end)
02306           {
02307             <font class="comment">/* This should not be able to happen, as long as validate_arg moves forward;</font>
02308 <font class="comment">             * but the check is here just to be paranoid.</font>
02309 <font class="comment">             */</font>
02310             _dbus_verbose (<font class="stringliteral">"array length %d specified was longer than actual array contents by %d\n"</font>,
02311                            len, end - pos);
02312             <font class="keywordflow">return</font> FALSE;
02313           }
02314         
02315         <font class="keywordflow">if</font> (pos &gt; end)
02316           {
02317             _dbus_verbose (<font class="stringliteral">"array contents exceeds array length %d by %d\n"</font>, len, pos - end);
02318             <font class="keywordflow">return</font> FALSE;
02319           }
02320 
02321         *end_pos = pos;
02322       }
02323       <font class="keywordflow">break</font>;
02324 
02325     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
02326       {
02327         <font class="keywordtype">int</font> dict_type;
02328         <font class="keywordtype">int</font> len;
02329         <font class="keywordtype">int</font> end;
02330         
02331         len = demarshal_and_validate_len (str, byte_order, pos, &amp;pos);
02332         <font class="keywordflow">if</font> (len &lt; 0)
02333           <font class="keywordflow">return</font> FALSE;
02334 
02335         <font class="keywordflow">if</font> (len &gt; _dbus_string_get_length (str) - pos)
02336           {
02337             _dbus_verbose (<font class="stringliteral">"dict length outside length of the message\n"</font>);
02338             <font class="keywordflow">return</font> FALSE;
02339           }
02340         
02341         end = pos + len;
02342         
02343         <font class="keywordflow">while</font> (pos &lt; end)
02344           {
02345             <font class="comment">/* Validate name */</font>
02346             <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (str, byte_order, depth + 1,
02347                                              DBUS_TYPE_STRING, -1, pos, &amp;pos))
02348               <font class="keywordflow">return</font> FALSE;
02349             
02350             <font class="keywordflow">if</font> (!_dbus_marshal_validate_type (str, pos, &amp;dict_type, &amp;pos))
02351               {
02352                 _dbus_verbose (<font class="stringliteral">"invalid dict entry type at offset %d\n"</font>, pos);
02353                 <font class="keywordflow">return</font> FALSE;
02354               }
02355             
02356             <font class="comment">/* Validate element */</font>
02357             <font class="keywordflow">if</font> (!_dbus_marshal_validate_arg (str, byte_order, depth + 1,
02358                                              dict_type, -1, pos, &amp;pos))
02359               {
02360                 _dbus_verbose (<font class="stringliteral">"dict arg invalid at offset %d\n"</font>, pos);
02361                 <font class="keywordflow">return</font> FALSE;
02362               }
02363           }
02364         
02365         <font class="keywordflow">if</font> (pos &gt; end)
02366           {
02367             _dbus_verbose (<font class="stringliteral">"dict contents exceed stated dict length\n"</font>);
02368             <font class="keywordflow">return</font> FALSE;
02369           }
02370         
02371         *end_pos = pos;
02372       }
02373       <font class="keywordflow">break</font>;
02374       
02375     <font class="keywordflow">default</font>:
02376       _dbus_verbose (<font class="stringliteral">"Unknown message arg type %d\n"</font>, type);
02377       <font class="keywordflow">return</font> FALSE;
02378     }
02379 
02380   <font class="keywordflow">if</font> (*end_pos &gt; _dbus_string_get_length (str))
02381     <font class="keywordflow">return</font> FALSE;
02382   
02383   <font class="keywordflow">return</font> TRUE;
02384 }
02385 
02391 dbus_bool_t
<a name="l02392"></a><a class="code" href="group__DBusMarshal.html#a66">02392</a> _dbus_type_is_valid (<font class="keywordtype">int</font> typecode)
02393 {
02394   <font class="keywordflow">switch</font> (typecode)
02395     {
02396     <font class="keywordflow">case</font> DBUS_TYPE_NIL:
02397     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02398     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02399     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02400     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02401     <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02402     <font class="keywordflow">case</font> DBUS_TYPE_UINT64:
02403     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02404     <font class="keywordflow">case</font> DBUS_TYPE_STRING:
02405     <font class="keywordflow">case</font> DBUS_TYPE_CUSTOM:
02406     <font class="keywordflow">case</font> DBUS_TYPE_ARRAY:
02407     <font class="keywordflow">case</font> DBUS_TYPE_DICT:
02408     <font class="keywordflow">case</font> DBUS_TYPE_OBJECT_PATH:
02409       <font class="keywordflow">return</font> TRUE;
02410       
02411     <font class="keywordflow">default</font>:
02412       <font class="keywordflow">return</font> FALSE;
02413     }
02414 }
02415 
02424 <font class="keywordtype">void</font>
<a name="l02425"></a><a class="code" href="group__DBusMarshal.html#a71">02425</a> _dbus_verbose_bytes (<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *data,
02426                      <font class="keywordtype">int</font>                  len)
02427 {
02428   <font class="keywordtype">int</font> i;
02429   <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *aligned;
02430 
02431   _dbus_assert (len &gt;= 0);
02432   
02433   <font class="comment">/* Print blanks on first row if appropriate */</font>
02434   aligned = _DBUS_ALIGN_ADDRESS (data, 4);
02435   <font class="keywordflow">if</font> (aligned &gt; data)
02436     aligned -= 4;
02437   _dbus_assert (aligned &lt;= data);
02438 
02439   <font class="keywordflow">if</font> (aligned != data)
02440     {
02441       _dbus_verbose (<font class="stringliteral">"%4d\t%p: "</font>, - (data - aligned), aligned); 
02442       <font class="keywordflow">while</font> (aligned != data)
02443         {
02444           _dbus_verbose (<font class="stringliteral">"    "</font>);
02445           ++aligned;
02446         }
02447     }
02448 
02449   <font class="comment">/* now print the bytes */</font>
02450   i = 0;
02451   <font class="keywordflow">while</font> (i &lt; len)
02452     {
02453       <font class="keywordflow">if</font> (_DBUS_ALIGN_ADDRESS (&amp;data[i], 4) == &amp;data[i])
02454         {
02455           _dbus_verbose (<font class="stringliteral">"%4d\t%p: "</font>,
02456                    i, &amp;data[i]);
02457         }
02458       
02459       <font class="keywordflow">if</font> (data[i] &gt;= 32 &amp;&amp;
02460           data[i] &lt;= 126)
02461         _dbus_verbose (<font class="stringliteral">" '%c' "</font>, data[i]);
02462       <font class="keywordflow">else</font>
02463         _dbus_verbose (<font class="stringliteral">"0x%s%x "</font>,
02464                  data[i] &lt;= 0xf ? <font class="stringliteral">"0"</font> : <font class="stringliteral">""</font>, data[i]);
02465 
02466       ++i;
02467 
02468       <font class="keywordflow">if</font> (_DBUS_ALIGN_ADDRESS (&amp;data[i], 4) == &amp;data[i])
02469         {
02470           <font class="keywordflow">if</font> (i &gt; 3)
02471             _dbus_verbose (<font class="stringliteral">"BE: %d LE: %d"</font>,
02472                            _dbus_unpack_uint32 (DBUS_BIG_ENDIAN, &amp;data[i-4]),
02473                            _dbus_unpack_uint32 (DBUS_LITTLE_ENDIAN, &amp;data[i-4]));
02474 
02475           <font class="keywordflow">if</font> (i &gt; 7 &amp;&amp; 
02476               _DBUS_ALIGN_ADDRESS (&amp;data[i], 8) == &amp;data[i])
02477             {
02478               _dbus_verbose (<font class="stringliteral">" dbl: %g"</font>,
02479                              *(<font class="keywordtype">double</font>*)&amp;data[i-8]);
02480             }
02481           
02482           _dbus_verbose (<font class="stringliteral">"\n"</font>);
02483         }
02484     }
02485 
02486   _dbus_verbose (<font class="stringliteral">"\n"</font>);
02487 }
02488 
02496 <font class="keywordtype">void</font>
<a name="l02497"></a><a class="code" href="group__DBusMarshal.html#a72">02497</a> _dbus_verbose_bytes_of_string (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a>    *str,
02498                                <font class="keywordtype">int</font>                  start,
02499                                <font class="keywordtype">int</font>                  len)
02500 {
02501   <font class="keyword">const</font> <font class="keywordtype">char</font> *d;
02502   <font class="keywordtype">int</font> real_len;
02503 
02504   real_len = _dbus_string_get_length (str);
02505 
02506   _dbus_assert (start &gt;= 0);
02507   
02508   <font class="keywordflow">if</font> (start &gt; real_len)
02509     {
02510       _dbus_verbose (<font class="stringliteral">"  [%d,%d) is not inside string of length %d\n"</font>,
02511                      start, len, real_len);
02512       <font class="keywordflow">return</font>;
02513     }
02514 
02515   <font class="keywordflow">if</font> ((start + len) &gt; real_len)
02516     {
02517       _dbus_verbose (<font class="stringliteral">"  [%d,%d) extends outside string of length %d\n"</font>,
02518                      start, len, real_len);
02519       len = real_len - start;
02520     }
02521   
02522   d = _dbus_string_get_const_data_len (str, start, len);
02523 
02524   _dbus_verbose_bytes (d, len);
02525 }
02526 
02536 dbus_bool_t
<a name="l02537"></a><a class="code" href="group__DBusMarshal.html#a69">02537</a> _dbus_marshal_basic_type (<a class="code" href="structDBusString.html">DBusString</a> *str,
02538                           <font class="keywordtype">char</font>        type,
02539                           <font class="keywordtype">void</font>       *value,
02540                           <font class="keywordtype">int</font>         byte_order)
02541 {
02542   dbus_bool_t retval;
02543 
02544   <font class="keywordflow">switch</font> (type)
02545     {
02546     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02547     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02548       retval = _dbus_string_append_byte (str, *(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *)value);
02549       <font class="keywordflow">break</font>;
02550     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02551     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02552       <font class="keywordflow">return</font> marshal_4_octets (str, byte_order, *(dbus_uint32_t *)value);
02553       <font class="keywordflow">break</font>;
02554 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02555 <font class="preprocessor"></font>    <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02556     <font class="keywordflow">case</font> DBUS_TYPE_UINT64: 
02557       retval = _dbus_marshal_uint64 (str, byte_order, *(dbus_uint64_t *)value);
02558       <font class="keywordflow">break</font>;
02559 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02560     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02561       retval = _dbus_marshal_double (str, byte_order, *(<font class="keywordtype">double</font> *)value);
02562       <font class="keywordflow">break</font>;
02563     <font class="keywordflow">default</font>:
02564       _dbus_assert_not_reached (<font class="stringliteral">"not a basic type"</font>);
02565       retval = FALSE;
02566       <font class="keywordflow">break</font>;
02567     }
02568   <font class="keywordflow">return</font> retval;
02569 }
02570 
02581 dbus_bool_t
<a name="l02582"></a><a class="code" href="group__DBusMarshal.html#a70">02582</a> _dbus_marshal_basic_type_array (<a class="code" href="structDBusString.html">DBusString</a> *str,
02583                                 <font class="keywordtype">char</font>        element_type,
02584                                 <font class="keyword">const</font> <font class="keywordtype">void</font> *value,
02585                                 <font class="keywordtype">int</font>         len,
02586                                 <font class="keywordtype">int</font>         byte_order)
02587 {
02588   <font class="keywordflow">switch</font> (element_type)
02589     {
02590     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
02591       <font class="comment">/* FIXME: we canonicalize to 0 or 1 for the single boolean case </font>
02592 <font class="comment">       * should we here too ? */</font>
02593     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
02594       <font class="keywordflow">return</font> _dbus_marshal_byte_array (str, byte_order, value, len);
02595       <font class="keywordflow">break</font>;
02596     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
02597     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
02598       <font class="keywordflow">return</font> marshal_4_octets_array (str, byte_order, value, len);
02599       <font class="keywordflow">break</font>;
02600 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02601 <font class="preprocessor"></font>    <font class="keywordflow">case</font> DBUS_TYPE_INT64:
02602     <font class="keywordflow">case</font> DBUS_TYPE_UINT64: 
02603 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02604     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
02605       <font class="keywordflow">return</font> marshal_8_octets_array (str, byte_order, value, len);
02606       <font class="keywordflow">break</font>;
02607     <font class="keywordflow">default</font>:
02608       _dbus_assert_not_reached (<font class="stringliteral">"non basic type in array"</font>);
02609       <font class="keywordflow">break</font>;
02610     }
02611   <font class="keywordflow">return</font> FALSE;
02612 }
02613 
02616 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
02617 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-test.h"</font>
02618 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
02619 
02620 dbus_bool_t
02621 _dbus_marshal_test (<font class="keywordtype">void</font>)
02622 {
02623   <a class="code" href="structDBusString.html">DBusString</a> str;
02624   <font class="keywordtype">char</font> *tmp1, *tmp2;
02625   <font class="keywordtype">int</font> pos = 0, len;
02626   dbus_int32_t array1[3] = { 0x123, 0x456, 0x789 }, *array2;
02627 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02628 <font class="preprocessor"></font>  dbus_int64_t array3[3] = { DBUS_INT64_CONSTANT (0x123ffffffff), 
02629                              DBUS_INT64_CONSTANT (0x456ffffffff), 
02630                              DBUS_INT64_CONSTANT (0x789ffffffff) }, *array4;
02631 <font class="preprocessor">#endif</font>
02632 <font class="preprocessor"></font>  <font class="keywordtype">char</font> *s;
02633   <a class="code" href="structDBusString.html">DBusString</a> t;
02634   
02635   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;str))
02636     _dbus_assert_not_reached (<font class="stringliteral">"failed to init string"</font>);
02637 
02638   <font class="comment">/* Marshal doubles */</font>
02639   <font class="keywordflow">if</font> (!_dbus_marshal_double (&amp;str, DBUS_BIG_ENDIAN, 3.14))
02640     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal double value"</font>);
02641   <font class="keywordflow">if</font> (!_dbus_demarshal_double (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos) == 3.14)
02642     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02643 
02644   <font class="keywordflow">if</font> (!_dbus_marshal_double (&amp;str, DBUS_LITTLE_ENDIAN, 3.14))
02645     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal double value"</font>);
02646   <font class="keywordflow">if</font> (!_dbus_demarshal_double (&amp;str, DBUS_LITTLE_ENDIAN, pos, &amp;pos) == 3.14)
02647     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02648   
02649   <font class="comment">/* Marshal signed integers */</font>
02650   <font class="keywordflow">if</font> (!_dbus_marshal_int32 (&amp;str, DBUS_BIG_ENDIAN, -12345678))
02651     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02652   <font class="keywordflow">if</font> (!_dbus_demarshal_int32 (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos) == -12345678)
02653     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02654 
02655   <font class="keywordflow">if</font> (!_dbus_marshal_int32 (&amp;str, DBUS_LITTLE_ENDIAN, -12345678))
02656     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02657   <font class="keywordflow">if</font> (!_dbus_demarshal_int32 (&amp;str, DBUS_LITTLE_ENDIAN, pos, &amp;pos) == -12345678)
02658     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02659   
02660   <font class="comment">/* Marshal unsigned integers */</font>
02661   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;str, DBUS_BIG_ENDIAN, 0x12345678))
02662     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02663   <font class="keywordflow">if</font> (!_dbus_demarshal_uint32 (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos) == 0x12345678)
02664     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02665   
02666   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (&amp;str, DBUS_LITTLE_ENDIAN, 0x12345678))
02667     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02668   <font class="keywordflow">if</font> (!_dbus_demarshal_uint32 (&amp;str, DBUS_LITTLE_ENDIAN, pos, &amp;pos) == 0x12345678)
02669     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02670 
02671 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02672 <font class="preprocessor"></font>  <font class="comment">/* Marshal signed integers */</font>
02673   <font class="keywordflow">if</font> (!_dbus_marshal_int64 (&amp;str, DBUS_BIG_ENDIAN, DBUS_INT64_CONSTANT (-0x123456789abc7)))
02674     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02675   <font class="keywordflow">if</font> (_dbus_demarshal_int64 (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos) != DBUS_INT64_CONSTANT (-0x123456789abc7))
02676     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02677 
02678   <font class="keywordflow">if</font> (!_dbus_marshal_int64 (&amp;str, DBUS_LITTLE_ENDIAN, DBUS_INT64_CONSTANT (-0x123456789abc7)))
02679     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02680   <font class="keywordflow">if</font> (_dbus_demarshal_int64 (&amp;str, DBUS_LITTLE_ENDIAN, pos, &amp;pos) != DBUS_INT64_CONSTANT (-0x123456789abc7))
02681     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02682   
02683   <font class="comment">/* Marshal unsigned integers */</font>
02684   <font class="keywordflow">if</font> (!_dbus_marshal_uint64 (&amp;str, DBUS_BIG_ENDIAN, DBUS_UINT64_CONSTANT (0x123456789abc7)))
02685     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02686   <font class="keywordflow">if</font> (!(_dbus_demarshal_uint64 (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos) == DBUS_UINT64_CONSTANT (0x123456789abc7)))
02687     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02688   
02689   <font class="keywordflow">if</font> (!_dbus_marshal_uint64 (&amp;str, DBUS_LITTLE_ENDIAN, DBUS_UINT64_CONSTANT (0x123456789abc7)))
02690     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal signed integer value"</font>);
02691   <font class="keywordflow">if</font> (!(_dbus_demarshal_uint64 (&amp;str, DBUS_LITTLE_ENDIAN, pos, &amp;pos) == DBUS_UINT64_CONSTANT (0x123456789abc7)))
02692     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02693 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_HAVE_INT64 */</font>
02694   
02695   <font class="comment">/* Marshal strings */</font>
02696   tmp1 = <font class="stringliteral">"This is the dbus test string"</font>;
02697   <font class="keywordflow">if</font> (!_dbus_marshal_string (&amp;str, DBUS_BIG_ENDIAN, tmp1))
02698     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal string"</font>);
02699   tmp2 = _dbus_demarshal_string (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos);
02700   <font class="keywordflow">if</font> (!strcmp (tmp1, tmp2) == 0)
02701     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02702   dbus_free (tmp2);
02703 
02704   tmp1 = <font class="stringliteral">"This is the dbus test string"</font>;
02705   <font class="keywordflow">if</font> (!_dbus_marshal_string (&amp;str, DBUS_LITTLE_ENDIAN, tmp1))
02706     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal string"</font>);
02707   tmp2 = _dbus_demarshal_string (&amp;str, DBUS_LITTLE_ENDIAN, pos, &amp;pos);
02708   <font class="keywordflow">if</font> (!strcmp (tmp1, tmp2) == 0)
02709     _dbus_assert_not_reached (<font class="stringliteral">"demarshal failed"</font>);
02710   dbus_free (tmp2);
02711 
02712   <font class="comment">/* Marshal signed integer arrays */</font>
02713   <font class="keywordflow">if</font> (!_dbus_marshal_int32_array (&amp;str, DBUS_BIG_ENDIAN, array1, 3))
02714     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal integer array"</font>);
02715   <font class="keywordflow">if</font> (!_dbus_demarshal_int32_array (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos, &amp;array2, &amp;len))
02716     _dbus_assert_not_reached (<font class="stringliteral">"could not demarshal integer array"</font>);
02717 
02718   <font class="keywordflow">if</font> (len != 3)
02719     _dbus_assert_not_reached (<font class="stringliteral">"Signed integer array lengths differ!\n"</font>);
02720   dbus_free (array2);
02721 
02722 <font class="preprocessor">#ifdef DBUS_HAVE_INT64</font>
02723 <font class="preprocessor"></font>  <font class="comment">/* Marshal 64-bit signed integer arrays */</font>
02724   <font class="keywordflow">if</font> (!_dbus_marshal_int64_array (&amp;str, DBUS_BIG_ENDIAN, array3, 3))
02725     _dbus_assert_not_reached (<font class="stringliteral">"could not marshal integer array"</font>);
02726   <font class="keywordflow">if</font> (!_dbus_demarshal_int64_array (&amp;str, DBUS_BIG_ENDIAN, pos, &amp;pos, &amp;array4, &amp;len))
02727     _dbus_assert_not_reached (<font class="stringliteral">"could not demarshal integer array"</font>);
02728 
02729   <font class="keywordflow">if</font> (len != 3)
02730     _dbus_assert_not_reached (<font class="stringliteral">"Signed integer array lengths differ!\n"</font>);
02731   dbus_free (array4);
02732 
02733   <font class="comment">/* set/pack 64-bit integers */</font>
02734   _dbus_string_set_length (&amp;str, 8);
02735 
02736   <font class="comment">/* signed little */</font>
02737   _dbus_marshal_set_int64 (&amp;str, DBUS_LITTLE_ENDIAN,
02738                            0, DBUS_INT64_CONSTANT (-0x123456789abc7));
02739   
02740   _dbus_assert (DBUS_INT64_CONSTANT (-0x123456789abc7) ==
02741                 _dbus_unpack_int64 (DBUS_LITTLE_ENDIAN,
02742                                     _dbus_string_get_const_data (&amp;str)));
02743 
02744   <font class="comment">/* signed big */</font>
02745   _dbus_marshal_set_int64 (&amp;str, DBUS_BIG_ENDIAN,
02746                            0, DBUS_INT64_CONSTANT (-0x123456789abc7));
02747 
02748   _dbus_assert (DBUS_INT64_CONSTANT (-0x123456789abc7) ==
02749                 _dbus_unpack_int64 (DBUS_BIG_ENDIAN,
02750                                     _dbus_string_get_const_data (&amp;str)));
02751 
02752   <font class="comment">/* signed little pack */</font>
02753   _dbus_pack_int64 (DBUS_INT64_CONSTANT (-0x123456789abc7),
02754                     DBUS_LITTLE_ENDIAN,
02755                     _dbus_string_get_data (&amp;str));
02756   
02757   _dbus_assert (DBUS_INT64_CONSTANT (-0x123456789abc7) ==
02758                 _dbus_unpack_int64 (DBUS_LITTLE_ENDIAN,
02759                                     _dbus_string_get_const_data (&amp;str)));
02760 
02761   <font class="comment">/* signed big pack */</font>
02762   _dbus_pack_int64 (DBUS_INT64_CONSTANT (-0x123456789abc7),
02763                     DBUS_BIG_ENDIAN,
02764                     _dbus_string_get_data (&amp;str));
02765 
02766   _dbus_assert (DBUS_INT64_CONSTANT (-0x123456789abc7) ==
02767                 _dbus_unpack_int64 (DBUS_BIG_ENDIAN,
02768                                     _dbus_string_get_const_data (&amp;str)));
02769 
02770   <font class="comment">/* unsigned little */</font>
02771   _dbus_marshal_set_uint64 (&amp;str, DBUS_LITTLE_ENDIAN,
02772                             0, DBUS_UINT64_CONSTANT (0x123456789abc7));
02773   
02774   _dbus_assert (DBUS_UINT64_CONSTANT (0x123456789abc7) ==
02775                 _dbus_unpack_uint64 (DBUS_LITTLE_ENDIAN,
02776                                      _dbus_string_get_const_data (&amp;str)));
02777 
02778   <font class="comment">/* unsigned big */</font>
02779   _dbus_marshal_set_uint64 (&amp;str, DBUS_BIG_ENDIAN,
02780                             0, DBUS_UINT64_CONSTANT (0x123456789abc7));
02781 
02782   _dbus_assert (DBUS_UINT64_CONSTANT (0x123456789abc7) ==
02783                 _dbus_unpack_uint64 (DBUS_BIG_ENDIAN,
02784                                      _dbus_string_get_const_data (&amp;str)));
02785 
02786   <font class="comment">/* unsigned little pack */</font>
02787   _dbus_pack_uint64 (DBUS_UINT64_CONSTANT (0x123456789abc7),
02788                      DBUS_LITTLE_ENDIAN,
02789                      _dbus_string_get_data (&amp;str));
02790   
02791   _dbus_assert (DBUS_UINT64_CONSTANT (0x123456789abc7) ==
02792                 _dbus_unpack_uint64 (DBUS_LITTLE_ENDIAN,
02793                                      _dbus_string_get_const_data (&amp;str)));
02794 
02795   <font class="comment">/* unsigned big pack */</font>
02796   _dbus_pack_uint64 (DBUS_UINT64_CONSTANT (0x123456789abc7),
02797                      DBUS_BIG_ENDIAN,
02798                      _dbus_string_get_data (&amp;str));
02799 
02800   _dbus_assert (DBUS_UINT64_CONSTANT (0x123456789abc7) ==
02801                 _dbus_unpack_uint64 (DBUS_BIG_ENDIAN,
02802                                      _dbus_string_get_const_data (&amp;str)));
02803   
02804 <font class="preprocessor">#endif</font>
02805 <font class="preprocessor"></font>
02806   <font class="comment">/* set/pack 32-bit integers */</font>
02807   _dbus_string_set_length (&amp;str, 4);
02808 
02809   <font class="comment">/* signed little */</font>
02810   _dbus_marshal_set_int32 (&amp;str, DBUS_LITTLE_ENDIAN,
02811                            0, -0x123456);
02812   
02813   _dbus_assert (-0x123456 ==
02814                 _dbus_unpack_int32 (DBUS_LITTLE_ENDIAN,
02815                                     _dbus_string_get_const_data (&amp;str)));
02816 
02817   <font class="comment">/* signed big */</font>
02818   _dbus_marshal_set_int32 (&amp;str, DBUS_BIG_ENDIAN,
02819                            0, -0x123456);
02820 
02821   _dbus_assert (-0x123456 ==
02822                 _dbus_unpack_int32 (DBUS_BIG_ENDIAN,
02823                                     _dbus_string_get_const_data (&amp;str)));
02824 
02825   <font class="comment">/* signed little pack */</font>
02826   _dbus_pack_int32 (-0x123456,
02827                     DBUS_LITTLE_ENDIAN,
02828                     _dbus_string_get_data (&amp;str));
02829   
02830   _dbus_assert (-0x123456 ==
02831                 _dbus_unpack_int32 (DBUS_LITTLE_ENDIAN,
02832                                     _dbus_string_get_const_data (&amp;str)));
02833 
02834   <font class="comment">/* signed big pack */</font>
02835   _dbus_pack_int32 (-0x123456,
02836                     DBUS_BIG_ENDIAN,
02837                     _dbus_string_get_data (&amp;str));
02838 
02839   _dbus_assert (-0x123456 ==
02840                 _dbus_unpack_int32 (DBUS_BIG_ENDIAN,
02841                                     _dbus_string_get_const_data (&amp;str)));
02842 
02843   <font class="comment">/* unsigned little */</font>
02844   _dbus_marshal_set_uint32 (&amp;str, DBUS_LITTLE_ENDIAN,
02845                             0, 0x123456);
02846   
02847   _dbus_assert (0x123456 ==
02848                 _dbus_unpack_uint32 (DBUS_LITTLE_ENDIAN,
02849                                      _dbus_string_get_const_data (&amp;str)));
02850 
02851   <font class="comment">/* unsigned big */</font>
02852   _dbus_marshal_set_uint32 (&amp;str, DBUS_BIG_ENDIAN,
02853                             0, 0x123456);
02854 
02855   _dbus_assert (0x123456 ==
02856                 _dbus_unpack_uint32 (DBUS_BIG_ENDIAN,
02857                                      _dbus_string_get_const_data (&amp;str)));
02858 
02859   <font class="comment">/* unsigned little pack */</font>
02860   _dbus_pack_uint32 (0x123456,
02861                      DBUS_LITTLE_ENDIAN,
02862                      _dbus_string_get_data (&amp;str));
02863   
02864   _dbus_assert (0x123456 ==
02865                 _dbus_unpack_uint32 (DBUS_LITTLE_ENDIAN,
02866                                      _dbus_string_get_const_data (&amp;str)));
02867 
02868   <font class="comment">/* unsigned big pack */</font>
02869   _dbus_pack_uint32 (0x123456,
02870                      DBUS_BIG_ENDIAN,
02871                      _dbus_string_get_data (&amp;str));
02872 
02873   _dbus_assert (0x123456 ==
02874                 _dbus_unpack_uint32 (DBUS_BIG_ENDIAN,
02875                                      _dbus_string_get_const_data (&amp;str)));
02876 
02877 
02878   <font class="comment">/* Strings */</font>
02879   
02880   _dbus_string_set_length (&amp;str, 0);
02881 
02882   _dbus_marshal_string (&amp;str, DBUS_LITTLE_ENDIAN,
02883                         <font class="stringliteral">"Hello world"</font>);
02884   
02885   s = _dbus_demarshal_string (&amp;str, DBUS_LITTLE_ENDIAN, 0, NULL);
02886   _dbus_assert (strcmp (s, <font class="stringliteral">"Hello world"</font>) == 0);
02887   dbus_free (s);
02888 
02889   _dbus_string_init_const (&amp;t, <font class="stringliteral">"Hello world foo"</font>);
02890   
02891   _dbus_marshal_set_string (&amp;str, DBUS_LITTLE_ENDIAN, 0,
02892                             &amp;t, _dbus_string_get_length (&amp;t));
02893   
02894   s = _dbus_demarshal_string (&amp;str, DBUS_LITTLE_ENDIAN, 0, NULL);
02895   _dbus_assert (strcmp (s, <font class="stringliteral">"Hello world foo"</font>) == 0);
02896   dbus_free (s);
02897 
02898   _dbus_string_init_const (&amp;t, <font class="stringliteral">"Hello"</font>);
02899   
02900   _dbus_marshal_set_string (&amp;str, DBUS_LITTLE_ENDIAN, 0,
02901                             &amp;t, _dbus_string_get_length (&amp;t));
02902   
02903   s = _dbus_demarshal_string (&amp;str, DBUS_LITTLE_ENDIAN, 0, NULL);
02904   _dbus_assert (strcmp (s, <font class="stringliteral">"Hello"</font>) == 0);
02905   dbus_free (s);
02906 
02907   <font class="comment">/* Strings (big endian) */</font>
02908   
02909   _dbus_string_set_length (&amp;str, 0);
02910 
02911   _dbus_marshal_string (&amp;str, DBUS_BIG_ENDIAN,
02912                         <font class="stringliteral">"Hello world"</font>);
02913   
02914   s = _dbus_demarshal_string (&amp;str, DBUS_BIG_ENDIAN, 0, NULL);
02915   _dbus_assert (strcmp (s, <font class="stringliteral">"Hello world"</font>) == 0);
02916   dbus_free (s);
02917 
02918   _dbus_string_init_const (&amp;t, <font class="stringliteral">"Hello world foo"</font>);
02919   
02920   _dbus_marshal_set_string (&amp;str, DBUS_BIG_ENDIAN, 0,
02921                             &amp;t, _dbus_string_get_length (&amp;t));
02922   
02923   s = _dbus_demarshal_string (&amp;str, DBUS_BIG_ENDIAN, 0, NULL);
02924   _dbus_assert (strcmp (s, <font class="stringliteral">"Hello world foo"</font>) == 0);
02925   dbus_free (s);
02926 
02927   _dbus_string_init_const (&amp;t, <font class="stringliteral">"Hello"</font>);
02928   
02929   _dbus_marshal_set_string (&amp;str, DBUS_BIG_ENDIAN, 0,
02930                             &amp;t, _dbus_string_get_length (&amp;t));
02931   
02932   s = _dbus_demarshal_string (&amp;str, DBUS_BIG_ENDIAN, 0, NULL);
02933   _dbus_assert (strcmp (s, <font class="stringliteral">"Hello"</font>) == 0);
02934   dbus_free (s);
02935   
02936   _dbus_string_free (&amp;str);
02937       
02938   <font class="keywordflow">return</font> TRUE;
02939 }
02940 
02941 <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:25 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>