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