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