Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>dbus-message-builder.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.15 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>dbus-message-builder.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-message-builder.c Build messages from text files for testing (internal to D-BUS implementation)</font>
00003 <font class="comment"> * </font>
00004 <font class="comment"> * Copyright (C) 2003, 2004 Red Hat, Inc.</font>
00005 <font class="comment"> *</font>
00006 <font class="comment"> * Licensed under the Academic Free License version 2.0</font>
00007 <font class="comment"> * </font>
00008 <font class="comment"> * This program is free software; you can redistribute it and/or modify</font>
00009 <font class="comment"> * it under the terms of the GNU General Public License as published by</font>
00010 <font class="comment"> * the Free Software Foundation; either version 2 of the License, or</font>
00011 <font class="comment"> * (at your option) any later version.</font>
00012 <font class="comment"> *</font>
00013 <font class="comment"> * This program is distributed in the hope that it will be useful,</font>
00014 <font class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00015 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</font>
00016 <font class="comment"> * GNU General Public License for more details.</font>
00017 <font class="comment"> * </font>
00018 <font class="comment"> * You should have received a copy of the GNU General Public License</font>
00019 <font class="comment"> * along with this program; if not, write to the Free Software</font>
00020 <font class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</font>
00021 <font class="comment"> *</font>
00022 <font class="comment"> */</font>
00023 <font class="preprocessor">#include &lt;config.h&gt;</font>
00024 
00025 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00026 <font class="preprocessor"></font>
00027 <font class="preprocessor">#include "dbus-message-builder.h"</font>
00028 <font class="preprocessor">#include "dbus-hash.h"</font>
00029 <font class="preprocessor">#include "dbus-internals.h"</font>
00030 <font class="preprocessor">#include "dbus-marshal.h"</font>
00031 
<a name="l00046"></a><a class="code" href="structSavedLength.html">00046</a> <font class="keyword">typedef</font> <font class="keyword">struct</font>
00047 <font class="keyword"></font>{
<a name="l00048"></a><a class="code" href="structSavedLength.html#m0">00048</a>   <a class="code" href="structDBusString.html">DBusString</a> name; 
<a name="l00049"></a><a class="code" href="structSavedLength.html#m1">00049</a>   <font class="keywordtype">int</font> start;  
<a name="l00050"></a><a class="code" href="structSavedLength.html#m2">00050</a>   <font class="keywordtype">int</font> length; 
<a name="l00051"></a><a class="code" href="structSavedLength.html#m3">00051</a>   <font class="keywordtype">int</font> offset; 
<a name="l00052"></a><a class="code" href="structSavedLength.html#m4">00052</a>   <font class="keywordtype">int</font> endian; 
00053 } <a class="code" href="structSavedLength.html">SavedLength</a>;
00054 
00055 <font class="keyword">static</font> <font class="keywordtype">void</font>
00056 free_saved_length (<font class="keywordtype">void</font> *data)
00057 {
00058   <a class="code" href="structSavedLength.html">SavedLength</a> *sl = data;
00059 
00060   <font class="keywordflow">if</font> (sl == NULL)
00061     <font class="keywordflow">return</font>; <font class="comment">/* all hash free functions have to accept NULL */</font>
00062   
00063   _dbus_string_free (&amp;sl-&gt;<a class="code" href="structSavedLength.html#m0">name</a>);
00064   dbus_free (sl);
00065 }
00066 
00067 <font class="keyword">static</font> <a class="code" href="structSavedLength.html">SavedLength</a>*
00068 ensure_saved_length (<a class="code" href="structDBusHashTable.html">DBusHashTable</a>    *hash,
00069                      <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *name)
00070 {
00071   <a class="code" href="structSavedLength.html">SavedLength</a> *sl;
00072   <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
00073   
00074   s = _dbus_string_get_const_data (name);
00075 
00076   sl = _dbus_hash_table_lookup_string (hash, s);
00077   <font class="keywordflow">if</font> (sl != NULL)
00078     <font class="keywordflow">return</font> sl;
00079   
00080   sl = dbus_new0 (<a class="code" href="structSavedLength.html">SavedLength</a>, 1);
00081 
00082   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;sl-&gt;<a class="code" href="structSavedLength.html#m0">name</a>))
00083     {
00084       dbus_free (sl);
00085       <font class="keywordflow">return</font> NULL;
00086     }
00087 
00088   <font class="keywordflow">if</font> (!_dbus_string_copy (name, 0, &amp;sl-&gt;<a class="code" href="structSavedLength.html#m0">name</a>, 0))
00089     <font class="keywordflow">goto</font> failed;
00090 
00091   s = _dbus_string_get_const_data (&amp;sl-&gt;<a class="code" href="structSavedLength.html#m0">name</a>);
00092 
00093   <font class="keywordflow">if</font> (!_dbus_hash_table_insert_string (hash, (<font class="keywordtype">char</font>*)s, sl))
00094     <font class="keywordflow">goto</font> failed;
00095 
00096   sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a> = -1;
00097   sl-&gt;<a class="code" href="structSavedLength.html#m2">length</a> = -1;
00098   sl-&gt;<a class="code" href="structSavedLength.html#m3">offset</a> = -1;
00099   sl-&gt;<a class="code" href="structSavedLength.html#m4">endian</a> = -1;
00100   
00101   <font class="keywordflow">return</font> sl;
00102   
00103  failed:
00104   free_saved_length (sl);
00105   <font class="keywordflow">return</font> NULL;
00106 }
00107 
00108 <font class="keyword">static</font> dbus_bool_t
00109 save_start (<a class="code" href="structDBusHashTable.html">DBusHashTable</a>    *hash,
00110             <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *name,
00111             <font class="keywordtype">int</font>               start)
00112 {
00113   <a class="code" href="structSavedLength.html">SavedLength</a> *sl;
00114 
00115   sl = ensure_saved_length (hash, name);
00116 
00117   <font class="keywordflow">if</font> (sl == NULL)
00118     <font class="keywordflow">return</font> FALSE;
00119   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a> &gt;= 0)
00120     {
00121       _dbus_warn (<font class="stringliteral">"Same START_LENGTH given twice\n"</font>);
00122       <font class="keywordflow">return</font> FALSE;
00123     }
00124   <font class="keywordflow">else</font>
00125     sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a> = start;
00126 
00127   <font class="keywordflow">return</font> TRUE;
00128 }
00129 
00130 <font class="keyword">static</font> dbus_bool_t
00131 save_length (<a class="code" href="structDBusHashTable.html">DBusHashTable</a>    *hash,
00132              <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *name,
00133              <font class="keywordtype">int</font>               length)
00134 {
00135   <a class="code" href="structSavedLength.html">SavedLength</a> *sl;
00136 
00137   sl = ensure_saved_length (hash, name);
00138 
00139   <font class="keywordflow">if</font> (sl == NULL)
00140     <font class="keywordflow">return</font> FALSE;
00141   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (sl-&gt;<a class="code" href="structSavedLength.html#m2">length</a> &gt;= 0)
00142     {
00143       _dbus_warn (<font class="stringliteral">"Same END_LENGTH given twice\n"</font>);
00144       <font class="keywordflow">return</font> FALSE;
00145     }
00146   <font class="keywordflow">else</font>
00147     sl-&gt;<a class="code" href="structSavedLength.html#m2">length</a> = length;
00148 
00149   <font class="keywordflow">return</font> TRUE;
00150 }
00151 
00152 <font class="keyword">static</font> dbus_bool_t
00153 save_offset (<a class="code" href="structDBusHashTable.html">DBusHashTable</a>    *hash,
00154              <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *name,
00155              <font class="keywordtype">int</font>               offset,
00156              <font class="keywordtype">int</font>               endian)
00157 {
00158   <a class="code" href="structSavedLength.html">SavedLength</a> *sl;
00159 
00160   sl = ensure_saved_length (hash, name);
00161 
00162   <font class="keywordflow">if</font> (sl == NULL)
00163     <font class="keywordflow">return</font> FALSE;
00164   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (sl-&gt;<a class="code" href="structSavedLength.html#m3">offset</a> &gt;= 0)
00165     {
00166       _dbus_warn (<font class="stringliteral">"Same LENGTH given twice\n"</font>);
00167       <font class="keywordflow">return</font> FALSE;
00168     }
00169   <font class="keywordflow">else</font>
00170     {
00171       sl-&gt;<a class="code" href="structSavedLength.html#m3">offset</a> = offset;
00172       sl-&gt;<a class="code" href="structSavedLength.html#m4">endian</a> = endian;
00173     }
00174 
00175   <font class="keywordflow">return</font> TRUE;
00176 }
00177 
<a name="l00179"></a><a class="code" href="group__DBusMessageBuilder.html#a13">00179</a> <font class="preprocessor">#define SAVE_FOR_UNALIGN(str, boundary)                                 \</font>
00180 <font class="preprocessor">  int align_pad_start = _dbus_string_get_length (str);                  \</font>
00181 <font class="preprocessor">  int align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, (boundary))</font>
00182 <font class="preprocessor"></font>
<a name="l00184"></a><a class="code" href="group__DBusMessageBuilder.html#a14">00184</a> <font class="preprocessor">#define PERFORM_UNALIGN(str)                                    \</font>
00185 <font class="preprocessor">  if (unalign)                                                  \</font>
00186 <font class="preprocessor">    {                                                           \</font>
00187 <font class="preprocessor">      _dbus_string_delete ((str), align_pad_start,              \</font>
00188 <font class="preprocessor">                           align_pad_end - align_pad_start);    \</font>
00189 <font class="preprocessor">      unalign = FALSE;                                          \</font>
00190 <font class="preprocessor">    }</font>
00191 <font class="preprocessor"></font>
00192 
00193 <font class="keyword">static</font> dbus_bool_t
00194 append_quoted_string (<a class="code" href="structDBusString.html">DBusString</a>       *dest,
00195                       <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *quoted,
00196                       <font class="keywordtype">int</font>               start_pos,
00197                       <font class="keywordtype">int</font>              *new_pos)
00198 {
00199   dbus_bool_t in_quotes = FALSE;
00200   <font class="keywordtype">int</font> i;
00201 
00202   <font class="comment">/* FIXME: We might want to add escaping in case we want to put '</font>
00203 <font class="comment">   * characters in our strings.</font>
00204 <font class="comment">   */</font>
00205   
00206   i = start_pos;
00207   <font class="keywordflow">while</font> (i &lt; _dbus_string_get_length (quoted))
00208     {
00209       <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> b;
00210 
00211       b = _dbus_string_get_byte (quoted, i);
00212       
00213       <font class="keywordflow">if</font> (in_quotes)
00214         {
00215           <font class="keywordflow">if</font> (b == <font class="charliteral">'\''</font>)
00216             <font class="keywordflow">break</font>;
00217           <font class="keywordflow">else</font>
00218             {
00219               <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, b))
00220                 <font class="keywordflow">return</font> FALSE;
00221             }
00222         }
00223       <font class="keywordflow">else</font>
00224         {
00225           <font class="keywordflow">if</font> (b == <font class="charliteral">'\''</font>)
00226             in_quotes = TRUE;
00227           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (b == <font class="charliteral">' '</font> || b == <font class="charliteral">'\n'</font> || b == <font class="charliteral">'\t'</font>)
00228             <font class="keywordflow">break</font>; <font class="comment">/* end on whitespace if not quoted */</font>
00229           <font class="keywordflow">else</font>
00230             {
00231               <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, b))
00232                 <font class="keywordflow">return</font> FALSE;
00233             }
00234         }
00235       
00236       ++i;
00237     }
00238 
00239   <font class="keywordflow">if</font> (new_pos)
00240     *new_pos = i;
00241   
00242   <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, <font class="charliteral">'\0'</font>))
00243     <font class="keywordflow">return</font> FALSE;
00244   <font class="keywordflow">return</font> TRUE;
00245 }
00246 
00247 <font class="keyword">static</font> dbus_bool_t
00248 append_saved_length (<a class="code" href="structDBusString.html">DBusString</a>       *dest,
00249                      <a class="code" href="structDBusHashTable.html">DBusHashTable</a>    *length_hash,
00250                      <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *name,
00251                      <font class="keywordtype">int</font>               offset,
00252                      <font class="keywordtype">int</font>               endian)
00253 {
00254   <font class="keywordflow">if</font> (!save_offset (length_hash, name,
00255                     offset, endian))
00256     {
00257       _dbus_warn (<font class="stringliteral">"failed to save offset to LENGTH\n"</font>);
00258       <font class="keywordflow">return</font> FALSE;
00259     }
00260   
00261   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (dest, endian,
00262                              -1))
00263     {
00264       _dbus_warn (<font class="stringliteral">"failed to append a length\n"</font>);
00265       <font class="keywordflow">return</font> FALSE;
00266     }
00267 
00268   <font class="keywordflow">return</font> TRUE;
00269 }
00270 
00271 <font class="keyword">static</font> <font class="keywordtype">int</font>
00272 message_type_from_string (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str,
00273                           <font class="keywordtype">int</font>               start)
00274 {
00275   <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
00276 
00277   s = _dbus_string_get_const_data_len (str, start,
00278                                        _dbus_string_get_length (str) - start);
00279 
00280   <font class="keywordflow">if</font> (strncmp (s, <font class="stringliteral">"method_call"</font>, strlen (<font class="stringliteral">"method_call"</font>)) == 0)
00281     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_METHOD_CALL;
00282   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strncmp (s, <font class="stringliteral">"method_return"</font>, strlen (<font class="stringliteral">"method_return"</font>)) == 0)
00283     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_METHOD_RETURN;
00284   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strncmp (s, <font class="stringliteral">"signal"</font>, strlen (<font class="stringliteral">"signal"</font>)) == 0)
00285     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_SIGNAL;
00286   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strncmp (s, <font class="stringliteral">"error"</font>, strlen (<font class="stringliteral">"error"</font>)) == 0)
00287     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_ERROR;
00288   <font class="keywordflow">else</font> <font class="keywordflow">if</font> (strncmp (s, <font class="stringliteral">"invalid"</font>, strlen (<font class="stringliteral">"invalid"</font>)) == 0)
00289     <font class="keywordflow">return</font> DBUS_MESSAGE_TYPE_INVALID;
00290   <font class="keywordflow">else</font>
00291     <font class="keywordflow">return</font> -1;
00292 }
00293 
00294 <font class="keyword">static</font> dbus_bool_t
00295 append_string_field (<a class="code" href="structDBusString.html">DBusString</a> *dest,
00296                      <font class="keywordtype">int</font>         endian,
00297                      <font class="keywordtype">int</font>         field,
00298                      <font class="keywordtype">int</font>         type,
00299                      <font class="keyword">const</font> <font class="keywordtype">char</font> *value)
00300 {
00301   <font class="keywordtype">int</font> len;
00302   
00303   <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, field))
00304     {
00305       _dbus_warn (<font class="stringliteral">"couldn't append field name byte\n"</font>);
00306       <font class="keywordflow">return</font> FALSE;
00307     }
00308   
00309   <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, type))
00310     {
00311       _dbus_warn (<font class="stringliteral">"could not append typecode byte\n"</font>);
00312       <font class="keywordflow">return</font> FALSE;
00313     }
00314 
00315   len = strlen (value);
00316 
00317   <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (dest, endian, len))
00318     {
00319       _dbus_warn (<font class="stringliteral">"couldn't append string length\n"</font>);
00320       <font class="keywordflow">return</font> FALSE;
00321     }
00322   
00323   <font class="keywordflow">if</font> (!_dbus_string_append (dest, value))
00324     {
00325       _dbus_warn (<font class="stringliteral">"couldn't append field value\n"</font>);
00326       <font class="keywordflow">return</font> FALSE;
00327     }
00328 
00329   <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, 0))
00330     {
00331       _dbus_warn (<font class="stringliteral">"couldn't append string nul term\n"</font>);
00332       <font class="keywordflow">return</font> FALSE;
00333     }
00334 
00335   <font class="keywordflow">return</font> TRUE;
00336 }
00337 
00338 <font class="keyword">static</font> dbus_bool_t
00339 parse_basic_type (<a class="code" href="structDBusString.html">DBusString</a> *src, <font class="keywordtype">char</font> type,
00340                   <a class="code" href="structDBusString.html">DBusString</a> *dest, dbus_bool_t *unalign,
00341                   <font class="keywordtype">int</font> endian)
00342 {
00343   <font class="keywordtype">int</font> align;
00344   <font class="keywordtype">int</font> align_pad_start, align_pad_end;
00345   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> data[16];
00346 
00347   <font class="keywordflow">switch</font> (type)
00348     {
00349     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
00350     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
00351       align = 1;
00352       <font class="keywordflow">break</font>;
00353     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
00354     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
00355       align = 4;
00356       <font class="keywordflow">break</font>;
00357     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
00358       align = 8;
00359       <font class="keywordflow">break</font>;
00360     <font class="keywordflow">default</font>:
00361       _dbus_assert_not_reached (<font class="stringliteral">"not a basic type"</font>);
00362       <font class="keywordflow">break</font>;
00363     }
00364 
00365   align_pad_start = _dbus_string_get_length (dest);
00366   align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, align);
00367 
00368   _dbus_string_delete_first_word (src);
00369 
00370   <font class="keywordflow">if</font> (!_dbus_string_parse_basic_type (src, type, 0, data, NULL))
00371     {
00372       _dbus_verbose (<font class="stringliteral">"failed to parse type '%c'"</font>, type);
00373       <font class="keywordflow">return</font> FALSE;
00374     }
00375 
00376   <font class="keywordflow">if</font> (!_dbus_marshal_basic_type (dest, type, data, endian))
00377     {
00378       _dbus_verbose (<font class="stringliteral">"failed to marshal type '%c'"</font>, type);
00379       <font class="keywordflow">return</font> FALSE;
00380     }
00381 
00382   <font class="keywordflow">if</font> (*unalign)
00383     {
00384       _dbus_string_delete (dest, align_pad_start,
00385                            align_pad_end - align_pad_start);
00386       *unalign = FALSE;
00387     }
00388 
00389   <font class="keywordflow">return</font> TRUE;
00390 }
00391 
00392 <font class="keyword">static</font> dbus_bool_t
00393 parse_basic_array (<a class="code" href="structDBusString.html">DBusString</a> *src, <font class="keywordtype">char</font> type,
00394                    <a class="code" href="structDBusString.html">DBusString</a> *dest, dbus_bool_t *unalign,
00395                    <font class="keywordtype">int</font> endian)
00396 {
00397   <font class="keywordtype">int</font> array_align, elem_size;
00398   <font class="keywordtype">int</font> i, len, allocated;
00399   <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *values, b;
00400   <font class="keywordtype">int</font> values_offset;
00401   <font class="keywordtype">int</font> align_pad_start, align_pad_end;
00402   dbus_bool_t retval = FALSE;
00403 
00404   array_align = 4; <font class="comment">/* length */</font>
00405   <font class="keywordflow">switch</font> (type)
00406     {
00407     <font class="keywordflow">case</font> DBUS_TYPE_BYTE:
00408     <font class="keywordflow">case</font> DBUS_TYPE_BOOLEAN:
00409       elem_size = 1;
00410       <font class="keywordflow">break</font>;
00411     <font class="keywordflow">case</font> DBUS_TYPE_UINT32:
00412     <font class="keywordflow">case</font> DBUS_TYPE_INT32:
00413       elem_size = 4;
00414       <font class="keywordflow">break</font>;
00415     <font class="keywordflow">case</font> DBUS_TYPE_DOUBLE:
00416       array_align = 8;
00417       elem_size = 8;
00418       <font class="keywordflow">break</font>;
00419     <font class="keywordflow">default</font>:
00420       _dbus_assert_not_reached (<font class="stringliteral">"not a basic type"</font>);
00421       <font class="keywordflow">break</font>;
00422     }
00423 
00424   align_pad_start = _dbus_string_get_length (dest);
00425   align_pad_end = _DBUS_ALIGN_VALUE (align_pad_start, array_align);
00426 
00427   len = 0;
00428   allocated = 2;
00429   values = NULL;
00430   values_offset = 0;
00431           
00432   _dbus_string_delete_first_word (src);
00433   _dbus_string_skip_blank (src, 0, &amp;i);
00434   b = _dbus_string_get_byte (src, i++);
00435 
00436   <font class="keywordflow">if</font> (b != <font class="charliteral">'{'</font>)
00437     <font class="keywordflow">goto</font> failed;
00438 
00439   <font class="keywordflow">while</font> (i &lt; _dbus_string_get_length (src))
00440     {
00441       _dbus_string_skip_blank (src, i, &amp;i);
00442 
00443       <font class="keywordflow">if</font> (!values || len == allocated - 1)
00444         {
00445           allocated *= 2;
00446           values = dbus_realloc (values, allocated * elem_size);
00447           <font class="keywordflow">if</font> (!values)
00448             {
00449               _dbus_warn (<font class="stringliteral">"could not allocate memory for '%c' ARRAY\n"</font>, type);
00450               <font class="keywordflow">goto</font> failed;
00451             }
00452         }
00453 
00454       <font class="keywordflow">if</font> (!_dbus_string_parse_basic_type (src, type, i, values + values_offset, &amp;i))
00455         {
00456           _dbus_warn (<font class="stringliteral">"could not parse integer element %d of '%c' ARRAY\n"</font>, len, type);
00457           <font class="keywordflow">goto</font> failed;
00458         }
00459 
00460       values_offset += elem_size;
00461       len++;
00462               
00463       _dbus_string_skip_blank (src, i, &amp;i);
00464 
00465       b = _dbus_string_get_byte (src, i++);
00466 
00467       <font class="keywordflow">if</font> (b == <font class="charliteral">'}'</font>)
00468         <font class="keywordflow">break</font>;
00469       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (b != <font class="charliteral">','</font>)
00470         <font class="keywordflow">goto</font> failed;
00471     }
00472 
00473   <font class="keywordflow">if</font> (!_dbus_marshal_basic_type_array (dest, type, values, len, endian))
00474     {
00475       _dbus_warn (<font class="stringliteral">"failed to append '%c' ARRAY\n"</font>, type);
00476       <font class="keywordflow">goto</font> failed;
00477     }
00478 
00479   <font class="keywordflow">if</font> (*unalign)
00480     {
00481       _dbus_string_delete (dest, align_pad_start,
00482                            align_pad_end - align_pad_start);
00483       *unalign = FALSE;
00484     }
00485 
00486   retval = TRUE;
00487 
00488  failed:
00489   dbus_free (values);
00490   <font class="keywordflow">return</font> retval;
00491 }
00492 
00493 <font class="keyword">static</font> <font class="keywordtype">char</font>
00494 lookup_basic_type (<font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *str, dbus_bool_t *is_array)
00495 {
00496   <font class="keywordtype">int</font> i;
00497   <font class="keywordtype">char</font> type = DBUS_TYPE_INVALID;
00498   <font class="keyword">static</font> <font class="keyword">struct </font>{
00499     <font class="keyword">const</font> <font class="keywordtype">char</font> *name;
00500     <font class="keywordtype">char</font>        type;
00501   } name_to_type[] = {
00502     { <font class="stringliteral">"BYTE"</font>,    DBUS_TYPE_BYTE },
00503     { <font class="stringliteral">"BOOLEAN"</font>, DBUS_TYPE_BOOLEAN },
00504     { <font class="stringliteral">"INT32"</font>,   DBUS_TYPE_INT32 },
00505     { <font class="stringliteral">"UINT32"</font>,  DBUS_TYPE_UINT32 },
00506     { <font class="stringliteral">"DOUBLE"</font>,  DBUS_TYPE_DOUBLE }
00507   };
00508 
00509   <font class="keywordflow">for</font> (i = 0; i &lt; _DBUS_N_ELEMENTS(name_to_type); i++)
00510     {
00511       <font class="keyword">const</font> <font class="keywordtype">char</font> *name = name_to_type[i].name;
00512       <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (str, name)) 
00513         {
00514           <font class="keywordtype">int</font> offset = strlen (name);
00515           type = name_to_type[i].type;
00516           <font class="keywordflow">if</font> (is_array)
00517             *is_array = _dbus_string_find (str, offset, <font class="stringliteral">"_ARRAY"</font>, NULL);
00518           <font class="keywordflow">break</font>;
00519         }
00520     }
00521 
00522   <font class="keywordflow">return</font> type;
00523 }
00524 
00576 dbus_bool_t
<a name="l00577"></a><a class="code" href="group__DBusMessageBuilder.html#a12">00577</a> _dbus_message_data_load (<a class="code" href="structDBusString.html">DBusString</a>       *dest,
00578                          <font class="keyword">const</font> <a class="code" href="structDBusString.html">DBusString</a> *filename)
00579 {
00580   <a class="code" href="structDBusString.html">DBusString</a> file;
00581   <a class="code" href="structDBusError.html">DBusError</a> error;
00582   <a class="code" href="structDBusString.html">DBusString</a> line;
00583   dbus_bool_t retval;
00584   <font class="keywordtype">int</font> line_no;
00585   dbus_bool_t unalign;
00586   <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *length_hash;
00587   <font class="keywordtype">int</font> endian;
00588   <a class="code" href="structDBusHashIter.html">DBusHashIter</a> iter;
00589   <font class="keywordtype">char</font> type;
00590   dbus_bool_t is_array;
00591   
00592   retval = FALSE;
00593   length_hash = NULL;
00594   
00595   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;file))
00596     <font class="keywordflow">return</font> FALSE;
00597 
00598   <font class="keywordflow">if</font> (!_dbus_string_init (&amp;line))
00599     {
00600       _dbus_string_free (&amp;file);
00601       <font class="keywordflow">return</font> FALSE;
00602     }
00603 
00604   _dbus_verbose (<font class="stringliteral">"Loading %s\n"</font>, _dbus_string_get_const_data (filename));
00605 
00606   dbus_error_init (&amp;error);
00607   <font class="keywordflow">if</font> (!_dbus_file_get_contents (&amp;file, filename, &amp;error))
00608     {
00609       _dbus_warn (<font class="stringliteral">"Getting contents of %s failed: %s\n"</font>,
00610                   _dbus_string_get_const_data (filename), error.<a class="code" href="structDBusError.html#m1">message</a>);
00611       dbus_error_free (&amp;error);
00612       <font class="keywordflow">goto</font> out;
00613     }
00614 
00615   length_hash = _dbus_hash_table_new (DBUS_HASH_STRING,
00616                                       NULL,
00617                                       free_saved_length);
00618   <font class="keywordflow">if</font> (length_hash == NULL)
00619     <font class="keywordflow">goto</font> out;
00620   
00621   endian = DBUS_COMPILER_BYTE_ORDER;
00622   unalign = FALSE;
00623   line_no = 0;
00624  next_iteration:
00625   <font class="keywordflow">while</font> (_dbus_string_pop_line (&amp;file, &amp;line))
00626     {
00627       dbus_bool_t just_set_unalign;
00628 
00629       just_set_unalign = FALSE;
00630       line_no += 1;
00631 
00632       _dbus_string_delete_leading_blanks (&amp;line);
00633 
00634       <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;line) == 0)
00635         {
00636           <font class="comment">/* empty line */</font>
00637           <font class="keywordflow">goto</font> next_iteration;
00638         }
00639       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00640                                                <font class="stringliteral">"#"</font>))
00641         {
00642           <font class="comment">/* Ignore this comment */</font>
00643           <font class="keywordflow">goto</font> next_iteration;
00644         }
00645       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00646                                                <font class="stringliteral">"VALID_HEADER"</font>))
00647         {
00648           <font class="keywordtype">int</font> i;
00649           <a class="code" href="structDBusString.html">DBusString</a> name;
00650           <font class="keywordtype">int</font> message_type;
00651 
00652           <font class="keywordflow">if</font> (_dbus_string_get_length (&amp;line) &lt; (int) strlen (<font class="stringliteral">"VALID_HEADER "</font>))
00653             {
00654               _dbus_warn (<font class="stringliteral">"no args to VALID_HEADER\n"</font>);
00655               <font class="keywordflow">goto</font> parse_failed;
00656             }
00657           
00658           <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, endian))
00659             {
00660               _dbus_warn (<font class="stringliteral">"could not append endianness\n"</font>);
00661               <font class="keywordflow">goto</font> parse_failed;
00662             }
00663 
00664           message_type = message_type_from_string (&amp;line,
00665                                                    strlen (<font class="stringliteral">"VALID_HEADER "</font>));
00666           <font class="keywordflow">if</font> (message_type &lt; 0)
00667             {
00668               _dbus_warn (<font class="stringliteral">"VALID_HEADER not followed by space then known message type\n"</font>);
00669               <font class="keywordflow">goto</font> parse_failed;
00670             }
00671           
00672           <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, message_type))
00673             {
00674               _dbus_warn (<font class="stringliteral">"could not append message type\n"</font>);
00675               <font class="keywordflow">goto</font> parse_failed;
00676             }
00677           
00678           i = 0;
00679           <font class="keywordflow">while</font> (i &lt; 2)
00680             {
00681               <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, <font class="charliteral">'\0'</font>))
00682                 {
00683                   _dbus_warn (<font class="stringliteral">"could not append nul pad\n"</font>);
00684                   <font class="keywordflow">goto</font> parse_failed;
00685                 }
00686               ++i;
00687             }
00688 
00689           _dbus_string_init_const (&amp;name, <font class="stringliteral">"Header"</font>);
00690           <font class="keywordflow">if</font> (!append_saved_length (dest, length_hash,
00691                                     &amp;name, _dbus_string_get_length (dest),
00692                                     endian))
00693             <font class="keywordflow">goto</font> parse_failed;
00694 
00695           _dbus_string_init_const (&amp;name, <font class="stringliteral">"Body"</font>);
00696           <font class="keywordflow">if</font> (!append_saved_length (dest, length_hash,
00697                                     &amp;name, _dbus_string_get_length (dest),
00698                                     endian))
00699             <font class="keywordflow">goto</font> parse_failed;
00700           
00701           <font class="comment">/* client serial */</font>
00702           <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (dest, endian, 1))
00703             {
00704               _dbus_warn (<font class="stringliteral">"couldn't append client serial\n"</font>);
00705               <font class="keywordflow">goto</font> parse_failed;
00706             }
00707         }
00708       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00709                                                <font class="stringliteral">"REQUIRED_FIELDS"</font>))
00710         {
00711           <font class="keywordflow">if</font> (!append_string_field (dest, endian,
00712                                     DBUS_HEADER_FIELD_INTERFACE,
00713                                     DBUS_TYPE_STRING,
00714                                     <font class="stringliteral">"org.freedesktop.BlahBlahInterface"</font>))
00715             <font class="keywordflow">goto</font> parse_failed;
00716           <font class="keywordflow">if</font> (!append_string_field (dest, endian,
00717                                     DBUS_HEADER_FIELD_MEMBER,
00718                                     DBUS_TYPE_STRING,
00719                                     <font class="stringliteral">"BlahBlahMethod"</font>))
00720             <font class="keywordflow">goto</font> parse_failed;
00721           <font class="keywordflow">if</font> (!append_string_field (dest, endian,
00722                                     DBUS_HEADER_FIELD_PATH,
00723                                     DBUS_TYPE_OBJECT_PATH,
00724                                     <font class="stringliteral">"/blah/blah/path"</font>))
00725             <font class="keywordflow">goto</font> parse_failed;
00726 
00727           <font class="comment">/* FIXME later we'll validate this, and then it will break</font>
00728 <font class="comment">           * and the .message files will have to include the right thing</font>
00729 <font class="comment">           */</font>
00730           <font class="keywordflow">if</font> (!append_string_field (dest, endian,
00731                                     DBUS_HEADER_FIELD_SIGNATURE,
00732                                     DBUS_TYPE_STRING,
00733                                     <font class="stringliteral">"iii"</font>))
00734             <font class="keywordflow">goto</font> parse_failed;
00735         }
00736       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00737                                                <font class="stringliteral">"BIG_ENDIAN"</font>))
00738         {
00739           endian = DBUS_BIG_ENDIAN;
00740         }
00741       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00742                                                <font class="stringliteral">"LITTLE_ENDIAN"</font>))
00743         {
00744           endian = DBUS_LITTLE_ENDIAN;
00745         }
00746       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00747                                                <font class="stringliteral">"OPPOSITE_ENDIAN"</font>))
00748         {
00749           <font class="keywordflow">if</font> (endian == DBUS_BIG_ENDIAN)
00750             endian = DBUS_LITTLE_ENDIAN;
00751           <font class="keywordflow">else</font>
00752             endian = DBUS_BIG_ENDIAN;
00753         }
00754       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00755                                                <font class="stringliteral">"ALIGN"</font>))
00756         {
00757           <font class="keywordtype">long</font> val;
00758           <font class="keywordtype">int</font> end;
00759           <font class="keywordtype">int</font> orig_len;
00760           
00761           _dbus_string_delete_first_word (&amp;line);
00762 
00763           <font class="keywordflow">if</font> (!_dbus_string_parse_int (&amp;line, 0, &amp;val, &amp;end))
00764             {
00765               _dbus_warn (<font class="stringliteral">"Failed to parse integer\n"</font>);
00766               <font class="keywordflow">goto</font> parse_failed;
00767             }
00768 
00769           <font class="keywordflow">if</font> (val &gt; 8)
00770             {
00771               _dbus_warn (<font class="stringliteral">"Aligning to %ld boundary is crack\n"</font>,
00772                           val);
00773               <font class="keywordflow">goto</font> parse_failed;
00774             }
00775 
00776           orig_len = _dbus_string_get_length (dest);
00777           
00778           <font class="keywordflow">if</font> (!_dbus_string_align_length (dest, val))
00779             <font class="keywordflow">goto</font> parse_failed;
00780 
00781           <font class="keywordflow">if</font> (_dbus_string_parse_int (&amp;line, end, &amp;val, NULL))
00782             {
00783               <font class="comment">/* If there's an optional second int argument,</font>
00784 <font class="comment">               * fill in align padding with that value</font>
00785 <font class="comment">               */</font>
00786               <font class="keywordflow">if</font> (val &lt; 0 || val &gt; 255)
00787                 {
00788                   _dbus_warn (<font class="stringliteral">"can't fill align padding with %ld, must be a byte value\n"</font>, val);
00789                   <font class="keywordflow">goto</font> parse_failed;
00790                 }
00791 
00792               end = orig_len;
00793               <font class="keywordflow">while</font> (end &lt; _dbus_string_get_length (dest))
00794                 {
00795                   _dbus_string_set_byte (dest, end, val);
00796                   ++end;
00797                 }
00798             }
00799         }
00800       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"UNALIGN"</font>))
00801         {
00802           unalign = TRUE;
00803           just_set_unalign = TRUE;
00804         }
00805       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"CHOP"</font>))
00806         {
00807           <font class="keywordtype">long</font> val;
00808 
00809           <font class="comment">/* FIXME if you CHOP the offset for a LENGTH</font>
00810 <font class="comment">           * command, we segfault.</font>
00811 <font class="comment">           */</font>
00812           
00813           _dbus_string_delete_first_word (&amp;line);
00814 
00815           <font class="keywordflow">if</font> (!_dbus_string_parse_int (&amp;line, 0, &amp;val, NULL))
00816             {
00817               _dbus_warn (<font class="stringliteral">"Failed to parse integer to chop\n"</font>);
00818               <font class="keywordflow">goto</font> parse_failed;
00819             }
00820 
00821           <font class="keywordflow">if</font> (val &gt; _dbus_string_get_length (dest))
00822             {
00823               _dbus_warn (<font class="stringliteral">"Trying to chop %ld bytes but we only have %d\n"</font>,
00824                           val,
00825                           _dbus_string_get_length (dest));
00826               <font class="keywordflow">goto</font> parse_failed;
00827             }
00828           
00829           _dbus_string_shorten (dest, val);
00830         }
00831       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00832                                                <font class="stringliteral">"START_LENGTH"</font>))
00833         {
00834           _dbus_string_delete_first_word (&amp;line);
00835 
00836           <font class="keywordflow">if</font> (!save_start (length_hash, &amp;line,
00837                            _dbus_string_get_length (dest)))
00838             {
00839               _dbus_warn (<font class="stringliteral">"failed to save length start\n"</font>);
00840               <font class="keywordflow">goto</font> parse_failed;
00841             }
00842         }
00843       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00844                                                <font class="stringliteral">"END_LENGTH"</font>))
00845         {
00846           _dbus_string_delete_first_word (&amp;line);
00847 
00848           <font class="keywordflow">if</font> (!save_length (length_hash, &amp;line,
00849                             _dbus_string_get_length (dest)))
00850             {
00851               _dbus_warn (<font class="stringliteral">"failed to save length end\n"</font>);
00852               <font class="keywordflow">goto</font> parse_failed;
00853             }
00854         }
00855       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00856                                                <font class="stringliteral">"LENGTH"</font>))
00857         {
00858           SAVE_FOR_UNALIGN (dest, 4);
00859           
00860           _dbus_string_delete_first_word (&amp;line);
00861 
00862           <font class="keywordflow">if</font> (!append_saved_length (dest, length_hash,
00863                                     &amp;line,
00864                                     unalign ? align_pad_start : align_pad_end,
00865                                     endian))
00866             {
00867               _dbus_warn (<font class="stringliteral">"failed to add LENGTH\n"</font>);
00868               <font class="keywordflow">goto</font> parse_failed;
00869             }
00870 
00871           PERFORM_UNALIGN (dest);
00872         }
00873       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00874                                                <font class="stringliteral">"HEADER_FIELD"</font>))
00875         {
00876           <font class="keywordtype">int</font> field;
00877 
00878           _dbus_string_delete_first_word (&amp;line);
00879 
00880           <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"INVALID"</font>))
00881             field = DBUS_HEADER_FIELD_INVALID;
00882           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"PATH"</font>))
00883             field = DBUS_HEADER_FIELD_PATH;
00884           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"INTERFACE"</font>))
00885             field = DBUS_HEADER_FIELD_INTERFACE;
00886           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"MEMBER"</font>))
00887             field = DBUS_HEADER_FIELD_MEMBER;
00888           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"ERROR_NAME"</font>))
00889             field = DBUS_HEADER_FIELD_ERROR_NAME;
00890           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"REPLY_SERIAL"</font>))
00891             field = DBUS_HEADER_FIELD_REPLY_SERIAL;
00892           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"DESTINATION"</font>))
00893             field = DBUS_HEADER_FIELD_DESTINATION;
00894           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"SENDER"</font>))
00895             field = DBUS_HEADER_FIELD_SENDER;
00896           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"SIGNATURE"</font>))
00897             field = DBUS_HEADER_FIELD_SIGNATURE;
00898           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"UNKNOWN"</font>))
00899             field = 22; <font class="comment">/* random unknown header field */</font>
00900           <font class="keywordflow">else</font>
00901             {
00902               _dbus_warn (<font class="stringliteral">"%s is not a valid header field name\n"</font>,
00903                           _dbus_string_get_const_data (&amp;line));
00904               <font class="keywordflow">goto</font> parse_failed;
00905             }
00906 
00907           <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, field))
00908             {
00909               _dbus_warn (<font class="stringliteral">"could not append header field name byte\n"</font>);
00910               <font class="keywordflow">goto</font> parse_failed;
00911             }
00912         }
00913       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00914                                                <font class="stringliteral">"TYPE"</font>))
00915         {
00916           <font class="keywordtype">int</font> code;
00917           
00918           _dbus_string_delete_first_word (&amp;line);          
00919 
00920           <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"INVALID"</font>))
00921             code = DBUS_TYPE_INVALID;
00922           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"NIL"</font>))
00923             code = DBUS_TYPE_NIL;
00924           <font class="keywordflow">else</font> <font class="keywordflow">if</font> ((code = lookup_basic_type (&amp;line, NULL)) != DBUS_TYPE_INVALID)
00925             ;
00926           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"STRING"</font>))
00927             code = DBUS_TYPE_STRING;
00928           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"OBJECT_PATH"</font>))
00929             code = DBUS_TYPE_OBJECT_PATH;
00930           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"CUSTOM"</font>))
00931             code = DBUS_TYPE_CUSTOM;
00932           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"ARRAY"</font>))
00933             code = DBUS_TYPE_ARRAY;
00934           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line, <font class="stringliteral">"DICT"</font>))
00935             code = DBUS_TYPE_DICT;
00936           <font class="keywordflow">else</font>
00937             {
00938               _dbus_warn (<font class="stringliteral">"%s is not a valid type name\n"</font>, _dbus_string_get_const_data (&amp;line));
00939               <font class="keywordflow">goto</font> parse_failed;
00940             }
00941 
00942           <font class="keywordflow">if</font> (!_dbus_string_append_byte (dest, code))
00943             {
00944               _dbus_warn (<font class="stringliteral">"could not append typecode byte\n"</font>);
00945               <font class="keywordflow">goto</font> parse_failed;
00946             }
00947         }
00948       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
00949                                                <font class="stringliteral">"STRING_ARRAY"</font>))
00950         {
00951           SAVE_FOR_UNALIGN (dest, 4);
00952           <font class="keywordtype">int</font> i, len, allocated;
00953           <font class="keywordtype">char</font> **values;
00954           <font class="keywordtype">char</font> *val;
00955           <a class="code" href="structDBusString.html">DBusString</a> val_str;
00956           <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> b;
00957 
00958           allocated = 4;
00959           values = dbus_new (<font class="keywordtype">char</font> *, allocated);
00960           <font class="keywordflow">if</font> (!values)
00961             {
00962               _dbus_warn (<font class="stringliteral">"could not allocate memory for STRING_ARRAY\n"</font>);
00963               <font class="keywordflow">goto</font> parse_failed;
00964             }
00965           
00966           len = 0;
00967           
00968           _dbus_string_delete_first_word (&amp;line);
00969           _dbus_string_skip_blank (&amp;line, 0, &amp;i);
00970           b = _dbus_string_get_byte (&amp;line, i++);
00971 
00972           <font class="keywordflow">if</font> (b != <font class="charliteral">'{'</font>)
00973             <font class="keywordflow">goto</font> parse_failed;
00974 
00975           _dbus_string_init (&amp;val_str);
00976           <font class="keywordflow">while</font> (i &lt; _dbus_string_get_length (&amp;line))
00977             {
00978               _dbus_string_skip_blank (&amp;line, i, &amp;i);
00979 
00980               <font class="keywordflow">if</font> (!append_quoted_string (&amp;val_str, &amp;line, i, &amp;i))
00981                 {
00982                   _dbus_warn (<font class="stringliteral">"could not parse quoted string for STRING_ARRAY\n"</font>);
00983                   <font class="keywordflow">goto</font> parse_failed;
00984                 }
00985               i++;
00986 
00987               <font class="keywordflow">if</font> (!_dbus_string_steal_data (&amp;val_str, &amp;val))
00988                 {
00989                   _dbus_warn (<font class="stringliteral">"could not allocate memory for STRING_ARRAY string\n"</font>);
00990                   <font class="keywordflow">goto</font> parse_failed;
00991                 }
00992               
00993               values[len++] = val;
00994               <font class="keywordflow">if</font> (len == allocated)
00995                 {
00996                   allocated *= 2;
00997                   values = dbus_realloc (values, allocated * <font class="keyword">sizeof</font> (<font class="keywordtype">char</font> *));
00998                   <font class="keywordflow">if</font> (!values)
00999                     {
01000                       _dbus_warn (<font class="stringliteral">"could not allocate memory for STRING_ARRAY\n"</font>);
01001                       <font class="keywordflow">goto</font> parse_failed;
01002                     }
01003                 }
01004               
01005               _dbus_string_skip_blank (&amp;line, i, &amp;i);
01006               
01007               b = _dbus_string_get_byte (&amp;line, i++);
01008 
01009               <font class="keywordflow">if</font> (b == <font class="charliteral">'}'</font>)
01010                 <font class="keywordflow">break</font>;
01011               <font class="keywordflow">else</font> <font class="keywordflow">if</font> (b != <font class="charliteral">','</font>)
01012                 {
01013                   _dbus_warn (<font class="stringliteral">"missing comma when parsing STRING_ARRAY\n"</font>);
01014                   <font class="keywordflow">goto</font> parse_failed;
01015                 }
01016             }
01017           _dbus_string_free (&amp;val_str);
01018           
01019           <font class="keywordflow">if</font> (!_dbus_marshal_string_array (dest, endian, (<font class="keyword">const</font> <font class="keywordtype">char</font> **)values, len))
01020             {
01021               _dbus_warn (<font class="stringliteral">"failed to append STRING_ARRAY\n"</font>);
01022               <font class="keywordflow">goto</font> parse_failed;
01023             }
01024 
01025           values[len] = NULL;
01026           dbus_free_string_array (values);
01027           
01028           PERFORM_UNALIGN (dest);
01029         }
01030       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
01031                                                <font class="stringliteral">"STRING"</font>))
01032         {
01033           SAVE_FOR_UNALIGN (dest, 4);
01034           <font class="keywordtype">int</font> size_offset;
01035           <font class="keywordtype">int</font> old_len;
01036           
01037           _dbus_string_delete_first_word (&amp;line);
01038 
01039           size_offset = _dbus_string_get_length (dest);
01040           size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
01041           <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (dest, endian, 0))
01042             {
01043               _dbus_warn (<font class="stringliteral">"Failed to append string size\n"</font>);
01044               <font class="keywordflow">goto</font> parse_failed;
01045             }
01046 
01047           old_len = _dbus_string_get_length (dest);
01048           <font class="keywordflow">if</font> (!append_quoted_string (dest, &amp;line, 0, NULL))
01049             {
01050               _dbus_warn (<font class="stringliteral">"Failed to append quoted string\n"</font>);
01051               <font class="keywordflow">goto</font> parse_failed;
01052             }
01053 
01054           _dbus_marshal_set_uint32 (dest, endian, size_offset,
01055                                     <font class="comment">/* subtract 1 for nul */</font>
01056                                     _dbus_string_get_length (dest) - old_len - 1);
01057           
01058           PERFORM_UNALIGN (dest);
01059         }
01060       <font class="keywordflow">else</font> <font class="keywordflow">if</font> ((type = lookup_basic_type (&amp;line, &amp;is_array)) != DBUS_TYPE_INVALID)
01061         {
01062           <font class="keywordflow">if</font> (is_array)
01063             {
01064               <font class="keywordflow">if</font> (!parse_basic_array (&amp;line, type, dest, &amp;unalign, endian))
01065                 <font class="keywordflow">goto</font> parse_failed;
01066             }
01067           <font class="keywordflow">else</font>
01068             {
01069               <font class="keywordflow">if</font> (!parse_basic_type (&amp;line, type, dest, &amp;unalign, endian))
01070                 <font class="keywordflow">goto</font> parse_failed;
01071             }
01072         }
01073       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&amp;line,
01074                                               <font class="stringliteral">"OBJECT_PATH"</font>))
01075         {
01076           SAVE_FOR_UNALIGN (dest, 4);
01077           <font class="keywordtype">int</font> size_offset;
01078           <font class="keywordtype">int</font> old_len;
01079           
01080           _dbus_string_delete_first_word (&amp;line);
01081           
01082           size_offset = _dbus_string_get_length (dest);
01083           size_offset = _DBUS_ALIGN_VALUE (size_offset, 4);
01084           <font class="keywordflow">if</font> (!_dbus_marshal_uint32 (dest, endian, 0))
01085             {
01086               _dbus_warn (<font class="stringliteral">"Failed to append string size\n"</font>);
01087               <font class="keywordflow">goto</font> parse_failed;
01088             }
01089 
01090           old_len = _dbus_string_get_length (dest);
01091           <font class="keywordflow">if</font> (!append_quoted_string (dest, &amp;line, 0, NULL))
01092             {
01093               _dbus_warn (<font class="stringliteral">"Failed to append quoted string\n"</font>);
01094               <font class="keywordflow">goto</font> parse_failed;
01095             }
01096 
01097           _dbus_marshal_set_uint32 (dest, endian, size_offset,
01098                                     <font class="comment">/* subtract 1 for nul */</font>
01099                                     _dbus_string_get_length (dest) - old_len - 1);
01100           
01101           PERFORM_UNALIGN (dest);
01102         }      
01103       <font class="keywordflow">else</font>
01104         <font class="keywordflow">goto</font> parse_failed;
01105       
01106       <font class="keywordflow">if</font> (!just_set_unalign &amp;&amp; unalign)
01107         {
01108           _dbus_warn (<font class="stringliteral">"UNALIGN prior to something that isn't aligned\n"</font>);
01109           <font class="keywordflow">goto</font> parse_failed;
01110         }
01111 
01112       <font class="keywordflow">goto</font> next_iteration; <font class="comment">/* skip parse_failed */</font>
01113       
01114     parse_failed:
01115       {
01116         _dbus_warn (<font class="stringliteral">"couldn't process line %d \"%s\"\n"</font>,
01117                     line_no, _dbus_string_get_const_data (&amp;line));
01118         <font class="keywordflow">goto</font> out;
01119       }
01120     }
01121 
01122   _dbus_hash_iter_init (length_hash, &amp;iter);
01123   <font class="keywordflow">while</font> (_dbus_hash_iter_next (&amp;iter))
01124     {
01125       <a class="code" href="structSavedLength.html">SavedLength</a> *sl = _dbus_hash_iter_get_value (&amp;iter);
01126       <font class="keyword">const</font> <font class="keywordtype">char</font> *s;
01127 
01128       s = _dbus_string_get_const_data (&amp;sl-&gt;<a class="code" href="structSavedLength.html#m0">name</a>);
01129       
01130       <font class="keywordflow">if</font> (sl-&gt;<a class="code" href="structSavedLength.html#m2">length</a> &lt; 0)
01131         {
01132           _dbus_warn (<font class="stringliteral">"Used LENGTH %s but never did END_LENGTH\n"</font>,
01133                       s);
01134           <font class="keywordflow">goto</font> out;
01135         }
01136       <font class="keywordflow">else</font> <font class="keywordflow">if</font> (sl-&gt;<a class="code" href="structSavedLength.html#m3">offset</a> &lt; 0)
01137         {
01138           _dbus_warn (<font class="stringliteral">"Did END_LENGTH %s but never used LENGTH\n"</font>,
01139                       s);
01140           <font class="keywordflow">goto</font> out;
01141         }
01142       <font class="keywordflow">else</font>
01143         {
01144           <font class="keywordflow">if</font> (sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a> &lt; 0)
01145             sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a> = 0;
01146           
01147           _dbus_verbose (<font class="stringliteral">"Filling in length %s endian = %d offset = %d start = %d length = %d\n"</font>,
01148                          s, sl-&gt;<a class="code" href="structSavedLength.html#m4">endian</a>, sl-&gt;<a class="code" href="structSavedLength.html#m3">offset</a>, sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a>, sl-&gt;<a class="code" href="structSavedLength.html#m2">length</a>);
01149           _dbus_marshal_set_int32 (dest,
01150                                    sl-&gt;<a class="code" href="structSavedLength.html#m4">endian</a>,
01151                                    sl-&gt;<a class="code" href="structSavedLength.html#m3">offset</a>,
01152                                    sl-&gt;<a class="code" href="structSavedLength.html#m2">length</a> - sl-&gt;<a class="code" href="structSavedLength.html#m1">start</a>);
01153         }
01154 
01155       _dbus_hash_iter_remove_entry (&amp;iter);
01156     }
01157   
01158   retval = TRUE;
01159 
01160   _dbus_verbose_bytes_of_string (dest, 0, _dbus_string_get_length (dest));
01161   
01162  out:
01163   <font class="keywordflow">if</font> (length_hash != NULL)
01164     _dbus_hash_table_unref (length_hash);
01165   
01166   _dbus_string_free (&amp;file);
01167   _dbus_string_free (&amp;line);
01168   <font class="keywordflow">return</font> retval;
01169 }
01170 
01172 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
</pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:26 2004 for D-BUS by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.15 </small></address>
</body>
</html>