<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="pages.html">Related Pages</a> </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 <config.h></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 (&sl-><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 (&sl-><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, &sl-><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 (&sl-><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-><a class="code" href="structSavedLength.html#m1">start</a> = -1; 00097 sl-><a class="code" href="structSavedLength.html#m2">length</a> = -1; 00098 sl-><a class="code" href="structSavedLength.html#m3">offset</a> = -1; 00099 sl-><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-><a class="code" href="structSavedLength.html#m1">start</a> >= 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-><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-><a class="code" href="structSavedLength.html#m2">length</a> >= 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-><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-><a class="code" href="structSavedLength.html#m3">offset</a> >= 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-><a class="code" href="structSavedLength.html#m3">offset</a> = offset; 00172 sl-><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 < _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, &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 < _dbus_string_get_length (src)) 00440 { 00441 _dbus_string_skip_blank (src, i, &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, &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, &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 < _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 (&file)) 00596 <font class="keywordflow">return</font> FALSE; 00597 00598 <font class="keywordflow">if</font> (!_dbus_string_init (&line)) 00599 { 00600 _dbus_string_free (&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 (&error); 00607 <font class="keywordflow">if</font> (!_dbus_file_get_contents (&file, filename, &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 (&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 (&file, &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 (&line); 00633 00634 <font class="keywordflow">if</font> (_dbus_string_get_length (&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 (&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 (&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 (&line) < (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 (&line, 00665 strlen (<font class="stringliteral">"VALID_HEADER "</font>)); 00666 <font class="keywordflow">if</font> (message_type < 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 < 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 (&name, <font class="stringliteral">"Header"</font>); 00690 <font class="keywordflow">if</font> (!append_saved_length (dest, length_hash, 00691 &name, _dbus_string_get_length (dest), 00692 endian)) 00693 <font class="keywordflow">goto</font> parse_failed; 00694 00695 _dbus_string_init_const (&name, <font class="stringliteral">"Body"</font>); 00696 <font class="keywordflow">if</font> (!append_saved_length (dest, length_hash, 00697 &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 (&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 (&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 (&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 (&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 (&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 (&line); 00762 00763 <font class="keywordflow">if</font> (!_dbus_string_parse_int (&line, 0, &val, &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 > 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 (&line, end, &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 < 0 || val > 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 < _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 (&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 (&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 (&line); 00814 00815 <font class="keywordflow">if</font> (!_dbus_string_parse_int (&line, 0, &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 > _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 (&line, 00832 <font class="stringliteral">"START_LENGTH"</font>)) 00833 { 00834 _dbus_string_delete_first_word (&line); 00835 00836 <font class="keywordflow">if</font> (!save_start (length_hash, &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 (&line, 00844 <font class="stringliteral">"END_LENGTH"</font>)) 00845 { 00846 _dbus_string_delete_first_word (&line); 00847 00848 <font class="keywordflow">if</font> (!save_length (length_hash, &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 (&line, 00856 <font class="stringliteral">"LENGTH"</font>)) 00857 { 00858 SAVE_FOR_UNALIGN (dest, 4); 00859 00860 _dbus_string_delete_first_word (&line); 00861 00862 <font class="keywordflow">if</font> (!append_saved_length (dest, length_hash, 00863 &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 (&line, 00874 <font class="stringliteral">"HEADER_FIELD"</font>)) 00875 { 00876 <font class="keywordtype">int</font> field; 00877 00878 _dbus_string_delete_first_word (&line); 00879 00880 <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&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 (&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 (&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 (&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 (&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 (&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 (&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 (&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 (&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 (&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 (&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 (&line, 00914 <font class="stringliteral">"TYPE"</font>)) 00915 { 00916 <font class="keywordtype">int</font> code; 00917 00918 _dbus_string_delete_first_word (&line); 00919 00920 <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&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 (&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 (&line, NULL)) != DBUS_TYPE_INVALID) 00925 ; 00926 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (_dbus_string_starts_with_c_str (&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 (&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 (&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 (&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 (&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 (&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 (&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 (&line); 00969 _dbus_string_skip_blank (&line, 0, &i); 00970 b = _dbus_string_get_byte (&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 (&val_str); 00976 <font class="keywordflow">while</font> (i < _dbus_string_get_length (&line)) 00977 { 00978 _dbus_string_skip_blank (&line, i, &i); 00979 00980 <font class="keywordflow">if</font> (!append_quoted_string (&val_str, &line, i, &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 (&val_str, &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 (&line, i, &i); 01006 01007 b = _dbus_string_get_byte (&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 (&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 (&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 (&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, &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 (&line, &is_array)) != DBUS_TYPE_INVALID) 01061 { 01062 <font class="keywordflow">if</font> (is_array) 01063 { 01064 <font class="keywordflow">if</font> (!parse_basic_array (&line, type, dest, &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 (&line, type, dest, &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 (&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 (&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, &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 && 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 (&line)); 01118 <font class="keywordflow">goto</font> out; 01119 } 01120 } 01121 01122 _dbus_hash_iter_init (length_hash, &iter); 01123 <font class="keywordflow">while</font> (_dbus_hash_iter_next (&iter)) 01124 { 01125 <a class="code" href="structSavedLength.html">SavedLength</a> *sl = _dbus_hash_iter_get_value (&iter); 01126 <font class="keyword">const</font> <font class="keywordtype">char</font> *s; 01127 01128 s = _dbus_string_get_const_data (&sl-><a class="code" href="structSavedLength.html#m0">name</a>); 01129 01130 <font class="keywordflow">if</font> (sl-><a class="code" href="structSavedLength.html#m2">length</a> < 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-><a class="code" href="structSavedLength.html#m3">offset</a> < 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-><a class="code" href="structSavedLength.html#m1">start</a> < 0) 01145 sl-><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-><a class="code" href="structSavedLength.html#m4">endian</a>, sl-><a class="code" href="structSavedLength.html#m3">offset</a>, sl-><a class="code" href="structSavedLength.html#m1">start</a>, sl-><a class="code" href="structSavedLength.html#m2">length</a>); 01149 _dbus_marshal_set_int32 (dest, 01150 sl-><a class="code" href="structSavedLength.html#m4">endian</a>, 01151 sl-><a class="code" href="structSavedLength.html#m3">offset</a>, 01152 sl-><a class="code" href="structSavedLength.html#m2">length</a> - sl-><a class="code" href="structSavedLength.html#m1">start</a>); 01153 } 01154 01155 _dbus_hash_iter_remove_entry (&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 (&file); 01167 _dbus_string_free (&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>