<!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-connection.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-connection.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font> 00002 <font class="comment">/* dbus-connection.c DBusConnection object</font> 00003 <font class="comment"> *</font> 00004 <font class="comment"> * Copyright (C) 2002, 2003 Red Hat Inc.</font> 00005 <font class="comment"> *</font> 00006 <font class="comment"> * Licensed under the Academic Free License version 2.0</font> 00007 <font class="comment"> * </font> 00008 <font class="comment"> * This program is free software; you can redistribute it and/or modify</font> 00009 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> 00010 <font class="comment"> * the Free Software Foundation; either version 2 of the License, or</font> 00011 <font class="comment"> * (at your option) any later version.</font> 00012 <font class="comment"> *</font> 00013 <font class="comment"> * This program is distributed in the hope that it will be useful,</font> 00014 <font class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</font> 00015 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</font> 00016 <font class="comment"> * GNU General Public License for more details.</font> 00017 <font class="comment"> * </font> 00018 <font class="comment"> * You should have received a copy of the GNU General Public License</font> 00019 <font class="comment"> * along with this program; if not, write to the Free Software</font> 00020 <font class="comment"> * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</font> 00021 <font class="comment"> *</font> 00022 <font class="comment"> */</font> 00023 00024 <font class="preprocessor">#include <config.h></font> 00025 <font class="preprocessor">#include "dbus-connection.h"</font> 00026 <font class="preprocessor">#include "dbus-list.h"</font> 00027 <font class="preprocessor">#include "dbus-timeout.h"</font> 00028 <font class="preprocessor">#include "dbus-transport.h"</font> 00029 <font class="preprocessor">#include "dbus-watch.h"</font> 00030 <font class="preprocessor">#include "dbus-connection-internal.h"</font> 00031 <font class="preprocessor">#include "dbus-list.h"</font> 00032 <font class="preprocessor">#include "dbus-hash.h"</font> 00033 <font class="preprocessor">#include "dbus-message-internal.h"</font> 00034 <font class="preprocessor">#include "dbus-threads.h"</font> 00035 <font class="preprocessor">#include "dbus-protocol.h"</font> 00036 <font class="preprocessor">#include "dbus-dataslot.h"</font> 00037 <font class="preprocessor">#include "dbus-string.h"</font> 00038 <font class="preprocessor">#include "dbus-pending-call.h"</font> 00039 <font class="preprocessor">#include "dbus-object-tree.h"</font> 00040 <font class="preprocessor">#include "dbus-marshal.h"</font> 00041 00042 <font class="preprocessor">#if 0</font> 00043 <font class="preprocessor"></font><font class="preprocessor">#define CONNECTION_LOCK(connection) do { \</font> 00044 <font class="preprocessor"> _dbus_verbose (" LOCK: %s\n", _DBUS_FUNCTION_NAME); \</font> 00045 <font class="preprocessor"> dbus_mutex_lock ((connection)->mutex); \</font> 00046 <font class="preprocessor"> } while (0)</font> 00047 <font class="preprocessor"></font><font class="preprocessor">#define CONNECTION_UNLOCK(connection) do { \</font> 00048 <font class="preprocessor"> _dbus_verbose (" UNLOCK: %s\n", _DBUS_FUNCTION_NAME); \</font> 00049 <font class="preprocessor"> dbus_mutex_unlock ((connection)->mutex); \</font> 00050 <font class="preprocessor"> } while (0)</font> 00051 <font class="preprocessor"></font><font class="preprocessor">#else</font> 00052 <font class="preprocessor"></font><font class="preprocessor">#define CONNECTION_LOCK(connection) dbus_mutex_lock ((connection)->mutex)</font> 00053 <font class="preprocessor"></font><font class="preprocessor">#define CONNECTION_UNLOCK(connection) dbus_mutex_unlock ((connection)->mutex)</font> 00054 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 00055 <font class="preprocessor"></font> <a name="l00133"></a><a class="code" href="group__DBusConnectionInternals.html#a0">00133</a> <font class="keyword">typedef</font> <font class="keyword">struct </font><a class="code" href="structDBusMessageFilter.html">DBusMessageFilter</a> DBusMessageFilter; 00134 <a name="l00138"></a><a class="code" href="structDBusMessageFilter.html">00138</a> <font class="keyword">struct </font>DBusMessageFilter 00139 { <a name="l00140"></a><a class="code" href="structDBusMessageFilter.html#m0">00140</a> <a class="code" href="structDBusAtomic.html">DBusAtomic</a> <a class="code" href="structDBusMessageFilter.html#m0">refcount</a>; <a name="l00141"></a><a class="code" href="structDBusMessageFilter.html#m1">00141</a> DBusHandleMessageFunction <a class="code" href="structDBusMessageFilter.html#m1">function</a>; <a name="l00142"></a><a class="code" href="structDBusMessageFilter.html#m2">00142</a> <font class="keywordtype">void</font> *<a class="code" href="structDBusMessageFilter.html#m2">user_data</a>; <a name="l00143"></a><a class="code" href="structDBusMessageFilter.html#m3">00143</a> DBusFreeFunction <a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>; 00144 }; 00145 00146 <a name="l00150"></a><a class="code" href="structDBusPreallocatedSend.html">00150</a> <font class="keyword">struct </font><a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> 00151 { <a name="l00152"></a><a class="code" href="structDBusPreallocatedSend.html#m0">00152</a> <a class="code" href="structDBusConnection.html">DBusConnection</a> *<a class="code" href="structDBusPreallocatedSend.html#m0">connection</a>; <a name="l00153"></a><a class="code" href="structDBusPreallocatedSend.html#m1">00153</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>; <a name="l00154"></a><a class="code" href="structDBusPreallocatedSend.html#m2">00154</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>; 00155 }; 00156 00157 <font class="keyword">static</font> dbus_bool_t _dbus_modify_sigpipe = TRUE; 00158 <a name="l00162"></a><a class="code" href="structDBusConnection.html">00162</a> <font class="keyword">struct </font><a class="code" href="structDBusConnection.html">DBusConnection</a> 00163 { <a name="l00164"></a><a class="code" href="structDBusConnection.html#m0">00164</a> <a class="code" href="structDBusAtomic.html">DBusAtomic</a> <a class="code" href="structDBusConnection.html#m0">refcount</a>; <a name="l00166"></a><a class="code" href="structDBusConnection.html#m1">00166</a> DBusMutex *<a class="code" href="structDBusConnection.html#m1">mutex</a>; <a name="l00168"></a><a class="code" href="structDBusConnection.html#m2">00168</a> dbus_bool_t <a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>; <a name="l00169"></a><a class="code" href="structDBusConnection.html#m3">00169</a> DBusCondVar *<a class="code" href="structDBusConnection.html#m3">dispatch_cond</a>; <a name="l00171"></a><a class="code" href="structDBusConnection.html#m4">00171</a> dbus_bool_t <a class="code" href="structDBusConnection.html#m4">io_path_acquired</a>; <a name="l00172"></a><a class="code" href="structDBusConnection.html#m5">00172</a> DBusCondVar *<a class="code" href="structDBusConnection.html#m5">io_path_cond</a>; <a name="l00174"></a><a class="code" href="structDBusConnection.html#m6">00174</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>; <a name="l00175"></a><a class="code" href="structDBusConnection.html#m7">00175</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>; <a name="l00177"></a><a class="code" href="structDBusConnection.html#m8">00177</a> <a class="code" href="structDBusMessage.html">DBusMessage</a> *<a class="code" href="structDBusConnection.html#m8">message_borrowed</a>; <a name="l00178"></a><a class="code" href="structDBusConnection.html#m9">00178</a> DBusCondVar *<a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>; <a name="l00180"></a><a class="code" href="structDBusConnection.html#m10">00180</a> <font class="keywordtype">int</font> <a class="code" href="structDBusConnection.html#m10">n_outgoing</a>; <a name="l00181"></a><a class="code" href="structDBusConnection.html#m11">00181</a> <font class="keywordtype">int</font> <a class="code" href="structDBusConnection.html#m11">n_incoming</a>; <a name="l00183"></a><a class="code" href="structDBusConnection.html#m12">00183</a> <a class="code" href="structDBusCounter.html">DBusCounter</a> *<a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>; <a name="l00185"></a><a class="code" href="structDBusConnection.html#m13">00185</a> <a class="code" href="structDBusTransport.html">DBusTransport</a> *<a class="code" href="structDBusConnection.html#m13">transport</a>; <a name="l00186"></a><a class="code" href="structDBusConnection.html#m14">00186</a> <a class="code" href="structDBusWatchList.html">DBusWatchList</a> *<a class="code" href="structDBusConnection.html#m14">watches</a>; <a name="l00187"></a><a class="code" href="structDBusConnection.html#m15">00187</a> <a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *<a class="code" href="structDBusConnection.html#m15">timeouts</a>; <a name="l00189"></a><a class="code" href="structDBusConnection.html#m16">00189</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusConnection.html#m16">filter_list</a>; <a name="l00191"></a><a class="code" href="structDBusConnection.html#m17">00191</a> <a class="code" href="structDBusDataSlotList.html">DBusDataSlotList</a> <a class="code" href="structDBusConnection.html#m17">slot_list</a>; <a name="l00193"></a><a class="code" href="structDBusConnection.html#m18">00193</a> <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *<a class="code" href="structDBusConnection.html#m18">pending_replies</a>; <a name="l00195"></a><a class="code" href="structDBusConnection.html#m19">00195</a> dbus_uint32_t <a class="code" href="structDBusConnection.html#m19">client_serial</a>; <a name="l00196"></a><a class="code" href="structDBusConnection.html#m20">00196</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>; <a name="l00198"></a><a class="code" href="structDBusConnection.html#m21">00198</a> DBusWakeupMainFunction <a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a>; <a name="l00199"></a><a class="code" href="structDBusConnection.html#m22">00199</a> <font class="keywordtype">void</font> *<a class="code" href="structDBusConnection.html#m22">wakeup_main_data</a>; <a name="l00200"></a><a class="code" href="structDBusConnection.html#m23">00200</a> DBusFreeFunction <a class="code" href="structDBusConnection.html#m23">free_wakeup_main_data</a>; <a name="l00202"></a><a class="code" href="structDBusConnection.html#m24">00202</a> DBusDispatchStatusFunction <a class="code" href="structDBusConnection.html#m24">dispatch_status_function</a>; <a name="l00203"></a><a class="code" href="structDBusConnection.html#m25">00203</a> <font class="keywordtype">void</font> *<a class="code" href="structDBusConnection.html#m25">dispatch_status_data</a>; <a name="l00204"></a><a class="code" href="structDBusConnection.html#m26">00204</a> DBusFreeFunction <a class="code" href="structDBusConnection.html#m26">free_dispatch_status_data</a>; <a name="l00206"></a><a class="code" href="structDBusConnection.html#m27">00206</a> DBusDispatchStatus <a class="code" href="structDBusConnection.html#m27">last_dispatch_status</a>; <a name="l00208"></a><a class="code" href="structDBusConnection.html#m28">00208</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusConnection.html#m28">link_cache</a>; <a name="l00211"></a><a class="code" href="structDBusConnection.html#m29">00211</a> <a class="code" href="structDBusObjectTree.html">DBusObjectTree</a> *<a class="code" href="structDBusConnection.html#m29">objects</a>; <a name="l00213"></a><a class="code" href="structDBusConnection.html#m30">00213</a> <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> <a class="code" href="structDBusConnection.html#m30">exit_on_disconnect</a> : 1; 00214 }; 00215 00216 <font class="keyword">static</font> <font class="keywordtype">void</font> _dbus_connection_remove_timeout_locked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00217 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout); 00218 <font class="keyword">static</font> DBusDispatchStatus _dbus_connection_get_dispatch_status_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection); 00219 <font class="keyword">static</font> <font class="keywordtype">void</font> _dbus_connection_update_dispatch_status_and_unlock (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00220 DBusDispatchStatus new_status); 00221 <font class="keyword">static</font> <font class="keywordtype">void</font> _dbus_connection_last_unref (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection); 00222 00223 <font class="keyword">static</font> DBusMessageFilter * 00224 _dbus_message_filter_ref (DBusMessageFilter *filter) 00225 { 00226 _dbus_assert (filter-><a class="code" href="structDBusMessageFilter.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> > 0); 00227 _dbus_atomic_inc (&filter-><a class="code" href="structDBusMessageFilter.html#m0">refcount</a>); 00228 00229 <font class="keywordflow">return</font> filter; 00230 } 00231 00232 <font class="keyword">static</font> <font class="keywordtype">void</font> 00233 _dbus_message_filter_unref (DBusMessageFilter *filter) 00234 { 00235 _dbus_assert (filter-><a class="code" href="structDBusMessageFilter.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> > 0); 00236 00237 <font class="keywordflow">if</font> (_dbus_atomic_dec (&filter-><a class="code" href="structDBusMessageFilter.html#m0">refcount</a>) == 1) 00238 { 00239 <font class="keywordflow">if</font> (filter-><a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>) 00240 (* filter-><a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>) (filter-><a class="code" href="structDBusMessageFilter.html#m2">user_data</a>); 00241 00242 dbus_free (filter); 00243 } 00244 } 00245 00251 <font class="keywordtype">void</font> <a name="l00252"></a><a class="code" href="group__DBusConnectionInternals.html#a11">00252</a> _dbus_connection_lock (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00253 { 00254 CONNECTION_LOCK (connection); 00255 } 00256 00262 <font class="keywordtype">void</font> <a name="l00263"></a><a class="code" href="group__DBusConnectionInternals.html#a12">00263</a> _dbus_connection_unlock (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00264 { 00265 CONNECTION_UNLOCK (connection); 00266 } 00267 00275 <font class="keyword">static</font> <font class="keywordtype">void</font> 00276 _dbus_connection_wakeup_mainloop (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00277 { 00278 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a>) 00279 (*connection-><a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a>) (connection-><a class="code" href="structDBusConnection.html#m22">wakeup_main_data</a>); 00280 } 00281 00282 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font> 00283 <font class="preprocessor"></font><font class="comment">/* For now this function isn't used */</font> 00293 dbus_bool_t <a name="l00294"></a><a class="code" href="group__DBusConnectionInternals.html#a14">00294</a> _dbus_connection_queue_received_message (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00295 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message) 00296 { 00297 <a class="code" href="structDBusList.html">DBusList</a> *link; 00298 00299 link = _dbus_list_alloc_link (message); 00300 <font class="keywordflow">if</font> (link == NULL) 00301 <font class="keywordflow">return</font> FALSE; 00302 00303 dbus_message_ref (message); 00304 _dbus_connection_queue_received_message_link (connection, link); 00305 00306 <font class="keywordflow">return</font> TRUE; 00307 } 00308 <font class="preprocessor">#endif</font> 00309 <font class="preprocessor"></font> 00318 <font class="keywordtype">void</font> <a name="l00319"></a><a class="code" href="group__DBusConnectionInternals.html#a15">00319</a> _dbus_connection_queue_received_message_link (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00320 <a class="code" href="structDBusList.html">DBusList</a> *link) 00321 { 00322 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending; 00323 dbus_int32_t reply_serial; 00324 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message; 00325 00326 _dbus_assert (_dbus_transport_get_is_authenticated (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>)); 00327 00328 _dbus_list_append_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, 00329 link); 00330 message = link-><a class="code" href="structDBusList.html#m2">data</a>; 00331 00332 <font class="comment">/* If this is a reply we're waiting on, remove timeout for it */</font> 00333 reply_serial = dbus_message_get_reply_serial (message); 00334 <font class="keywordflow">if</font> (reply_serial != -1) 00335 { 00336 pending = _dbus_hash_table_lookup_int (connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a>, 00337 reply_serial); 00338 <font class="keywordflow">if</font> (pending != NULL) 00339 { 00340 <font class="keywordflow">if</font> (pending-><a class="code" href="structDBusPendingCall.html#m9">timeout_added</a>) 00341 _dbus_connection_remove_timeout_locked (connection, 00342 pending-><a class="code" href="structDBusPendingCall.html#m5">timeout</a>); 00343 00344 pending-><a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = FALSE; 00345 } 00346 } 00347 00348 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> += 1; 00349 00350 _dbus_connection_wakeup_mainloop (connection); 00351 00352 _dbus_verbose (<font class="stringliteral">"Message %p (%d %s '%s') added to incoming queue %p, %d incoming\n"</font>, 00353 message, 00354 dbus_message_get_type (message), 00355 dbus_message_get_interface (message) ? 00356 dbus_message_get_interface (message) : 00357 <font class="stringliteral">"no interface"</font>, 00358 dbus_message_get_signature (message), 00359 connection, 00360 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a>); 00361 } 00362 00373 <font class="keyword">static</font> <font class="keywordtype">void</font> 00374 _dbus_connection_queue_synthesized_message_link (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00375 <a class="code" href="structDBusList.html">DBusList</a> *link) 00376 { 00377 _dbus_list_append_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, link); 00378 00379 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> += 1; 00380 00381 _dbus_connection_wakeup_mainloop (connection); 00382 00383 _dbus_verbose (<font class="stringliteral">"Synthesized message %p added to incoming queue %p, %d incoming\n"</font>, 00384 link-><a class="code" href="structDBusList.html#m2">data</a>, connection, connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a>); 00385 } 00386 00387 00394 dbus_bool_t <a name="l00395"></a><a class="code" href="group__DBusConnectionInternals.html#a17">00395</a> _dbus_connection_have_messages_to_send (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00396 { 00397 <font class="keywordflow">return</font> connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a> != NULL; 00398 } 00399 00407 <a class="code" href="structDBusMessage.html">DBusMessage</a>* <a name="l00408"></a><a class="code" href="group__DBusConnectionInternals.html#a18">00408</a> _dbus_connection_get_message_to_send (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00409 { 00410 <font class="keywordflow">return</font> _dbus_list_get_last (&connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>); 00411 } 00412 00421 <font class="keywordtype">void</font> <a name="l00422"></a><a class="code" href="group__DBusConnectionInternals.html#a19">00422</a> _dbus_connection_message_sent (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00423 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message) 00424 { 00425 <a class="code" href="structDBusList.html">DBusList</a> *link; 00426 00427 _dbus_assert (_dbus_transport_get_is_authenticated (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>)); 00428 00429 link = _dbus_list_get_last_link (&connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>); 00430 _dbus_assert (link != NULL); 00431 _dbus_assert (link-><a class="code" href="structDBusList.html#m2">data</a> == message); 00432 00433 <font class="comment">/* Save this link in the link cache */</font> 00434 _dbus_list_unlink (&connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>, 00435 link); 00436 _dbus_list_prepend_link (&connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a>, link); 00437 00438 connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a> -= 1; 00439 00440 _dbus_verbose (<font class="stringliteral">"Message %p (%d %s '%s') removed from outgoing queue %p, %d left to send\n"</font>, 00441 message, 00442 dbus_message_get_type (message), 00443 dbus_message_get_interface (message) ? 00444 dbus_message_get_interface (message) : 00445 <font class="stringliteral">"no interface"</font>, 00446 dbus_message_get_signature (message), 00447 connection, connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a>); 00448 00449 <font class="comment">/* Save this link in the link cache also */</font> 00450 _dbus_message_remove_size_counter (message, connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>, 00451 &link); 00452 _dbus_list_prepend_link (&connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a>, link); 00453 00454 dbus_message_unref (message); 00455 00456 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a> == 0) 00457 _dbus_transport_messages_pending (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 00458 connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a>); 00459 } 00460 00471 dbus_bool_t <a name="l00472"></a><a class="code" href="group__DBusConnectionInternals.html#a20">00472</a> _dbus_connection_add_watch (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00473 <a class="code" href="structDBusWatch.html">DBusWatch</a> *watch) 00474 { 00475 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>) <font class="comment">/* null during finalize */</font> 00476 <font class="keywordflow">return</font> _dbus_watch_list_add_watch (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>, 00477 watch); 00478 <font class="keywordflow">else</font> 00479 <font class="keywordflow">return</font> FALSE; 00480 } 00481 00490 <font class="keywordtype">void</font> <a name="l00491"></a><a class="code" href="group__DBusConnectionInternals.html#a21">00491</a> _dbus_connection_remove_watch (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00492 <a class="code" href="structDBusWatch.html">DBusWatch</a> *watch) 00493 { 00494 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>) <font class="comment">/* null during finalize */</font> 00495 _dbus_watch_list_remove_watch (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>, 00496 watch); 00497 } 00498 00508 <font class="keywordtype">void</font> <a name="l00509"></a><a class="code" href="group__DBusConnectionInternals.html#a22">00509</a> _dbus_connection_toggle_watch (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00510 <a class="code" href="structDBusWatch.html">DBusWatch</a> *watch, 00511 dbus_bool_t enabled) 00512 { 00513 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>) <font class="comment">/* null during finalize */</font> 00514 _dbus_watch_list_toggle_watch (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>, 00515 watch, enabled); 00516 } 00517 00529 dbus_bool_t <a name="l00530"></a><a class="code" href="group__DBusConnectionInternals.html#a23">00530</a> _dbus_connection_add_timeout (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00531 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00532 { 00533 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>) <font class="comment">/* null during finalize */</font> 00534 <font class="keywordflow">return</font> _dbus_timeout_list_add_timeout (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>, 00535 timeout); 00536 <font class="keywordflow">else</font> 00537 <font class="keywordflow">return</font> FALSE; 00538 } 00539 00548 <font class="keywordtype">void</font> <a name="l00549"></a><a class="code" href="group__DBusConnectionInternals.html#a24">00549</a> _dbus_connection_remove_timeout (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00550 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00551 { 00552 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>) <font class="comment">/* null during finalize */</font> 00553 _dbus_timeout_list_remove_timeout (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>, 00554 timeout); 00555 } 00556 00557 <font class="keyword">static</font> <font class="keywordtype">void</font> 00558 _dbus_connection_remove_timeout_locked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00559 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00560 { 00561 CONNECTION_LOCK (connection); 00562 _dbus_connection_remove_timeout (connection, timeout); 00563 CONNECTION_UNLOCK (connection); 00564 } 00565 00575 <font class="keywordtype">void</font> <a name="l00576"></a><a class="code" href="group__DBusConnectionInternals.html#a25">00576</a> _dbus_connection_toggle_timeout (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00577 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout, 00578 dbus_bool_t enabled) 00579 { 00580 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>) <font class="comment">/* null during finalize */</font> 00581 _dbus_timeout_list_toggle_timeout (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>, 00582 timeout, enabled); 00583 } 00584 00585 <font class="keyword">static</font> dbus_bool_t 00586 _dbus_connection_attach_pending_call_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00587 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending) 00588 { 00589 _dbus_assert (pending-><a class="code" href="structDBusPendingCall.html#m7">reply_serial</a> != 0); 00590 00591 <font class="keywordflow">if</font> (!_dbus_connection_add_timeout (connection, pending-><a class="code" href="structDBusPendingCall.html#m5">timeout</a>)) 00592 <font class="keywordflow">return</font> FALSE; 00593 00594 <font class="keywordflow">if</font> (!_dbus_hash_table_insert_int (connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a>, 00595 pending-><a class="code" href="structDBusPendingCall.html#m7">reply_serial</a>, 00596 pending)) 00597 { 00598 _dbus_connection_remove_timeout (connection, pending-><a class="code" href="structDBusPendingCall.html#m5">timeout</a>); 00599 <font class="keywordflow">return</font> FALSE; 00600 } 00601 00602 pending-><a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = TRUE; 00603 pending-><a class="code" href="structDBusPendingCall.html#m3">connection</a> = connection; 00604 00605 dbus_pending_call_ref (pending); 00606 00607 <font class="keywordflow">return</font> TRUE; 00608 } 00609 00610 <font class="keyword">static</font> <font class="keywordtype">void</font> 00611 free_pending_call_on_hash_removal (<font class="keywordtype">void</font> *data) 00612 { 00613 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending; 00614 00615 <font class="keywordflow">if</font> (data == NULL) 00616 <font class="keywordflow">return</font>; 00617 00618 pending = data; 00619 00620 <font class="keywordflow">if</font> (pending-><a class="code" href="structDBusPendingCall.html#m3">connection</a>) 00621 { 00622 <font class="keywordflow">if</font> (pending-><a class="code" href="structDBusPendingCall.html#m9">timeout_added</a>) 00623 { 00624 _dbus_connection_remove_timeout (pending-><a class="code" href="structDBusPendingCall.html#m3">connection</a>, 00625 pending-><a class="code" href="structDBusPendingCall.html#m5">timeout</a>); 00626 pending-><a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = FALSE; 00627 } 00628 00629 pending-><a class="code" href="structDBusPendingCall.html#m3">connection</a> = NULL; 00630 00631 dbus_pending_call_unref (pending); 00632 } 00633 } 00634 00635 <font class="keyword">static</font> <font class="keywordtype">void</font> 00636 _dbus_connection_detach_pending_call_and_unlock (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00637 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending) 00638 { 00639 <font class="comment">/* The idea here is to avoid finalizing the pending call</font> 00640 <font class="comment"> * with the lock held, since there's a destroy notifier</font> 00641 <font class="comment"> * in pending call that goes out to application code.</font> 00642 <font class="comment"> */</font> 00643 dbus_pending_call_ref (pending); 00644 _dbus_hash_table_remove_int (connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a>, 00645 pending-><a class="code" href="structDBusPendingCall.html#m7">reply_serial</a>); 00646 CONNECTION_UNLOCK (connection); 00647 dbus_pending_call_unref (pending); 00648 } 00649 00658 <font class="keywordtype">void</font> <a name="l00659"></a><a class="code" href="group__DBusConnectionInternals.html#a29">00659</a> _dbus_connection_remove_pending_call (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00660 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending) 00661 { 00662 CONNECTION_LOCK (connection); 00663 _dbus_connection_detach_pending_call_and_unlock (connection, pending); 00664 } 00665 00674 <font class="keywordtype">void</font> <a name="l00675"></a><a class="code" href="group__DBusConnectionInternals.html#a30">00675</a> _dbus_pending_call_complete_and_unlock (<a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending, 00676 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message) 00677 { 00678 <font class="keywordflow">if</font> (message == NULL) 00679 { 00680 message = pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>-><a class="code" href="structDBusList.html#m2">data</a>; 00681 _dbus_list_clear (&pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>); 00682 } 00683 <font class="keywordflow">else</font> 00684 dbus_message_ref (message); 00685 00686 _dbus_verbose (<font class="stringliteral">" handing message %p (%s) to pending call serial %u\n"</font>, 00687 message, 00688 dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN ? 00689 <font class="stringliteral">"method return"</font> : 00690 dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? 00691 <font class="stringliteral">"error"</font> : <font class="stringliteral">"other type"</font>, 00692 pending-><a class="code" href="structDBusPendingCall.html#m7">reply_serial</a>); 00693 00694 _dbus_assert (pending-><a class="code" href="structDBusPendingCall.html#m4">reply</a> == NULL); 00695 _dbus_assert (pending-><a class="code" href="structDBusPendingCall.html#m7">reply_serial</a> == dbus_message_get_reply_serial (message)); 00696 pending-><a class="code" href="structDBusPendingCall.html#m4">reply</a> = message; 00697 00698 dbus_pending_call_ref (pending); <font class="comment">/* in case there's no app with a ref held */</font> 00699 _dbus_connection_detach_pending_call_and_unlock (pending-><a class="code" href="structDBusPendingCall.html#m3">connection</a>, pending); 00700 00701 <font class="comment">/* Must be called unlocked since it invokes app callback */</font> 00702 _dbus_pending_call_notify (pending); 00703 dbus_pending_call_unref (pending); 00704 } 00705 00715 <font class="keyword">static</font> dbus_bool_t 00716 _dbus_connection_acquire_io_path (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00717 <font class="keywordtype">int</font> timeout_milliseconds) 00718 { 00719 dbus_bool_t res = TRUE; 00720 00721 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m4">io_path_acquired</a>) 00722 { 00723 <font class="keywordflow">if</font> (timeout_milliseconds != -1) 00724 res = dbus_condvar_wait_timeout (connection-><a class="code" href="structDBusConnection.html#m5">io_path_cond</a>, 00725 connection-><a class="code" href="structDBusConnection.html#m1">mutex</a>, 00726 timeout_milliseconds); 00727 <font class="keywordflow">else</font> 00728 dbus_condvar_wait (connection-><a class="code" href="structDBusConnection.html#m5">io_path_cond</a>, connection-><a class="code" href="structDBusConnection.html#m1">mutex</a>); 00729 } 00730 00731 <font class="keywordflow">if</font> (res) 00732 { 00733 _dbus_assert (!connection-><a class="code" href="structDBusConnection.html#m4">io_path_acquired</a>); 00734 00735 connection-><a class="code" href="structDBusConnection.html#m4">io_path_acquired</a> = TRUE; 00736 } 00737 00738 <font class="keywordflow">return</font> res; 00739 } 00740 00748 <font class="keyword">static</font> <font class="keywordtype">void</font> 00749 _dbus_connection_release_io_path (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00750 { 00751 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m4">io_path_acquired</a>); 00752 00753 connection-><a class="code" href="structDBusConnection.html#m4">io_path_acquired</a> = FALSE; 00754 dbus_condvar_wake_one (connection-><a class="code" href="structDBusConnection.html#m5">io_path_cond</a>); 00755 } 00756 00757 00784 <font class="keywordtype">void</font> <a name="l00785"></a><a class="code" href="group__DBusConnectionInternals.html#a33">00785</a> _dbus_connection_do_iteration (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 00786 <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> flags, 00787 <font class="keywordtype">int</font> timeout_milliseconds) 00788 { 00789 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a> == 0) 00790 flags &= ~DBUS_ITERATION_DO_WRITING; 00791 00792 <font class="keywordflow">if</font> (_dbus_connection_acquire_io_path (connection, 00793 (flags & DBUS_ITERATION_BLOCK) ? timeout_milliseconds : 0)) 00794 { 00795 _dbus_transport_do_iteration (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 00796 flags, timeout_milliseconds); 00797 _dbus_connection_release_io_path (connection); 00798 } 00799 } 00800 00810 <a class="code" href="structDBusConnection.html">DBusConnection</a>* <a name="l00811"></a><a class="code" href="group__DBusConnectionInternals.html#a34">00811</a> _dbus_connection_new_for_transport (<a class="code" href="structDBusTransport.html">DBusTransport</a> *transport) 00812 { 00813 <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection; 00814 <a class="code" href="structDBusWatchList.html">DBusWatchList</a> *watch_list; 00815 <a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list; 00816 <a class="code" href="structDBusHashTable.html">DBusHashTable</a> *pending_replies; 00817 DBusMutex *mutex; 00818 DBusCondVar *message_returned_cond; 00819 DBusCondVar *dispatch_cond; 00820 DBusCondVar *io_path_cond; 00821 <a class="code" href="structDBusList.html">DBusList</a> *disconnect_link; 00822 <a class="code" href="structDBusMessage.html">DBusMessage</a> *disconnect_message; 00823 <a class="code" href="structDBusCounter.html">DBusCounter</a> *outgoing_counter; 00824 <a class="code" href="structDBusObjectTree.html">DBusObjectTree</a> *objects; 00825 00826 watch_list = NULL; 00827 connection = NULL; 00828 pending_replies = NULL; 00829 timeout_list = NULL; 00830 mutex = NULL; 00831 message_returned_cond = NULL; 00832 dispatch_cond = NULL; 00833 io_path_cond = NULL; 00834 disconnect_link = NULL; 00835 disconnect_message = NULL; 00836 outgoing_counter = NULL; 00837 objects = NULL; 00838 00839 watch_list = _dbus_watch_list_new (); 00840 <font class="keywordflow">if</font> (watch_list == NULL) 00841 <font class="keywordflow">goto</font> error; 00842 00843 timeout_list = _dbus_timeout_list_new (); 00844 <font class="keywordflow">if</font> (timeout_list == NULL) 00845 <font class="keywordflow">goto</font> error; 00846 00847 pending_replies = 00848 _dbus_hash_table_new (DBUS_HASH_INT, 00849 NULL, 00850 (DBusFreeFunction)free_pending_call_on_hash_removal); 00851 <font class="keywordflow">if</font> (pending_replies == NULL) 00852 <font class="keywordflow">goto</font> error; 00853 00854 connection = dbus_new0 (<a class="code" href="structDBusConnection.html">DBusConnection</a>, 1); 00855 <font class="keywordflow">if</font> (connection == NULL) 00856 <font class="keywordflow">goto</font> error; 00857 00858 mutex = dbus_mutex_new (); 00859 <font class="keywordflow">if</font> (mutex == NULL) 00860 <font class="keywordflow">goto</font> error; 00861 00862 message_returned_cond = dbus_condvar_new (); 00863 <font class="keywordflow">if</font> (message_returned_cond == NULL) 00864 <font class="keywordflow">goto</font> error; 00865 00866 dispatch_cond = dbus_condvar_new (); 00867 <font class="keywordflow">if</font> (dispatch_cond == NULL) 00868 <font class="keywordflow">goto</font> error; 00869 00870 io_path_cond = dbus_condvar_new (); 00871 <font class="keywordflow">if</font> (io_path_cond == NULL) 00872 <font class="keywordflow">goto</font> error; 00873 00874 disconnect_message = dbus_message_new_signal (DBUS_PATH_ORG_FREEDESKTOP_LOCAL, 00875 DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, 00876 <font class="stringliteral">"Disconnected"</font>); 00877 00878 <font class="keywordflow">if</font> (disconnect_message == NULL) 00879 <font class="keywordflow">goto</font> error; 00880 00881 disconnect_link = _dbus_list_alloc_link (disconnect_message); 00882 <font class="keywordflow">if</font> (disconnect_link == NULL) 00883 <font class="keywordflow">goto</font> error; 00884 00885 outgoing_counter = _dbus_counter_new (); 00886 <font class="keywordflow">if</font> (outgoing_counter == NULL) 00887 <font class="keywordflow">goto</font> error; 00888 00889 objects = _dbus_object_tree_new (connection); 00890 <font class="keywordflow">if</font> (objects == NULL) 00891 <font class="keywordflow">goto</font> error; 00892 00893 <font class="keywordflow">if</font> (_dbus_modify_sigpipe) 00894 _dbus_disable_sigpipe (); 00895 00896 connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1; 00897 connection-><a class="code" href="structDBusConnection.html#m1">mutex</a> = mutex; 00898 connection-><a class="code" href="structDBusConnection.html#m3">dispatch_cond</a> = dispatch_cond; 00899 connection-><a class="code" href="structDBusConnection.html#m5">io_path_cond</a> = io_path_cond; 00900 connection-><a class="code" href="structDBusConnection.html#m9">message_returned_cond</a> = message_returned_cond; 00901 connection-><a class="code" href="structDBusConnection.html#m13">transport</a> = transport; 00902 connection-><a class="code" href="structDBusConnection.html#m14">watches</a> = watch_list; 00903 connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a> = timeout_list; 00904 connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a> = pending_replies; 00905 connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a> = outgoing_counter; 00906 connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a> = NULL; 00907 connection-><a class="code" href="structDBusConnection.html#m27">last_dispatch_status</a> = DBUS_DISPATCH_COMPLETE; <font class="comment">/* so we're notified first time there's data */</font> 00908 connection-><a class="code" href="structDBusConnection.html#m29">objects</a> = objects; 00909 connection-><a class="code" href="structDBusConnection.html#m30">exit_on_disconnect</a> = FALSE; 00910 00911 _dbus_data_slot_list_init (&connection-><a class="code" href="structDBusConnection.html#m17">slot_list</a>); 00912 00913 connection-><a class="code" href="structDBusConnection.html#m19">client_serial</a> = 1; 00914 00915 connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a> = disconnect_link; 00916 00917 <font class="keywordflow">if</font> (!_dbus_transport_set_connection (transport, connection)) 00918 <font class="keywordflow">goto</font> error; 00919 00920 _dbus_transport_ref (transport); 00921 00922 <font class="keywordflow">return</font> connection; 00923 00924 error: 00925 <font class="keywordflow">if</font> (disconnect_message != NULL) 00926 dbus_message_unref (disconnect_message); 00927 00928 <font class="keywordflow">if</font> (disconnect_link != NULL) 00929 _dbus_list_free_link (disconnect_link); 00930 00931 <font class="keywordflow">if</font> (io_path_cond != NULL) 00932 dbus_condvar_free (io_path_cond); 00933 00934 <font class="keywordflow">if</font> (dispatch_cond != NULL) 00935 dbus_condvar_free (dispatch_cond); 00936 00937 <font class="keywordflow">if</font> (message_returned_cond != NULL) 00938 dbus_condvar_free (message_returned_cond); 00939 00940 <font class="keywordflow">if</font> (mutex != NULL) 00941 dbus_mutex_free (mutex); 00942 00943 <font class="keywordflow">if</font> (connection != NULL) 00944 dbus_free (connection); 00945 00946 <font class="keywordflow">if</font> (pending_replies) 00947 _dbus_hash_table_unref (pending_replies); 00948 00949 <font class="keywordflow">if</font> (watch_list) 00950 _dbus_watch_list_free (watch_list); 00951 00952 <font class="keywordflow">if</font> (timeout_list) 00953 _dbus_timeout_list_free (timeout_list); 00954 00955 <font class="keywordflow">if</font> (outgoing_counter) 00956 _dbus_counter_unref (outgoing_counter); 00957 00958 <font class="keywordflow">if</font> (objects) 00959 _dbus_object_tree_unref (objects); 00960 00961 <font class="keywordflow">return</font> NULL; 00962 } 00963 00971 <a class="code" href="structDBusConnection.html">DBusConnection</a> * <a name="l00972"></a><a class="code" href="group__DBusConnectionInternals.html#a35">00972</a> _dbus_connection_ref_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00973 { 00974 <font class="preprocessor">#ifdef DBUS_HAVE_ATOMIC_INT</font> 00975 <font class="preprocessor"></font> _dbus_atomic_inc (&connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>); 00976 <font class="preprocessor">#else</font> 00977 <font class="preprocessor"></font> _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> > 0); 00978 connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> += 1; 00979 <font class="preprocessor">#endif</font> 00980 <font class="preprocessor"></font> 00981 <font class="keywordflow">return</font> connection; 00982 } 00983 00990 <font class="keywordtype">void</font> <a name="l00991"></a><a class="code" href="group__DBusConnectionInternals.html#a36">00991</a> _dbus_connection_unref_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 00992 { 00993 dbus_bool_t last_unref; 00994 00995 _dbus_return_if_fail (connection != NULL); 00996 00997 <font class="comment">/* The connection lock is better than the global</font> 00998 <font class="comment"> * lock in the atomic increment fallback</font> 00999 <font class="comment"> */</font> 01000 01001 <font class="preprocessor">#ifdef DBUS_HAVE_ATOMIC_INT</font> 01002 <font class="preprocessor"></font> last_unref = (_dbus_atomic_dec (&connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>) == 1); 01003 <font class="preprocessor">#else </font> 01004 <font class="preprocessor"></font> _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> > 0); 01005 01006 connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> -= 1; 01007 last_unref = (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> == 0); 01008 <font class="preprocessor">#if 0</font> 01009 <font class="preprocessor"></font> printf (<font class="stringliteral">"unref_unlocked() connection %p count = %d\n"</font>, connection, connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a>); 01010 <font class="preprocessor">#endif</font> 01011 <font class="preprocessor"></font><font class="preprocessor">#endif</font> 01012 <font class="preprocessor"></font> 01013 <font class="keywordflow">if</font> (last_unref) 01014 _dbus_connection_last_unref (connection); 01015 } 01016 01017 <font class="keyword">static</font> dbus_uint32_t 01018 _dbus_connection_get_next_client_serial (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01019 { 01020 <font class="keywordtype">int</font> serial; 01021 01022 serial = connection-><a class="code" href="structDBusConnection.html#m19">client_serial</a>++; 01023 01024 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m19">client_serial</a> < 0) 01025 connection-><a class="code" href="structDBusConnection.html#m19">client_serial</a> = 1; 01026 01027 <font class="keywordflow">return</font> serial; 01028 } 01029 01043 dbus_bool_t <a name="l01044"></a><a class="code" href="group__DBusConnectionInternals.html#a38">01044</a> _dbus_connection_handle_watch (<a class="code" href="structDBusWatch.html">DBusWatch</a> *watch, 01045 <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> condition, 01046 <font class="keywordtype">void</font> *data) 01047 { 01048 <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection; 01049 dbus_bool_t retval; 01050 DBusDispatchStatus status; 01051 01052 connection = data; 01053 01054 CONNECTION_LOCK (connection); 01055 _dbus_connection_acquire_io_path (connection, -1); 01056 retval = _dbus_transport_handle_watch (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 01057 watch, condition); 01058 _dbus_connection_release_io_path (connection); 01059 01060 status = _dbus_connection_get_dispatch_status_unlocked (connection); 01061 01062 <font class="comment">/* this calls out to user code */</font> 01063 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 01064 01065 <font class="keywordflow">return</font> retval; 01066 } 01067 01092 <a class="code" href="structDBusConnection.html">DBusConnection</a>* <a name="l01093"></a><a class="code" href="group__DBusConnection.html#a1">01093</a> dbus_connection_open (<font class="keyword">const</font> <font class="keywordtype">char</font> *address, 01094 <a class="code" href="structDBusError.html">DBusError</a> *error) 01095 { 01096 <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection; 01097 <a class="code" href="structDBusTransport.html">DBusTransport</a> *transport; 01098 01099 _dbus_return_val_if_fail (address != NULL, NULL); 01100 _dbus_return_val_if_error_is_set (error, NULL); 01101 01102 transport = _dbus_transport_open (address, error); 01103 <font class="keywordflow">if</font> (transport == NULL) 01104 { 01105 _DBUS_ASSERT_ERROR_IS_SET (error); 01106 <font class="keywordflow">return</font> NULL; 01107 } 01108 01109 connection = _dbus_connection_new_for_transport (transport); 01110 01111 _dbus_transport_unref (transport); 01112 01113 <font class="keywordflow">if</font> (connection == NULL) 01114 { 01115 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 01116 <font class="keywordflow">return</font> NULL; 01117 } 01118 01119 <font class="keywordflow">return</font> connection; 01120 } 01121 01128 <a class="code" href="structDBusConnection.html">DBusConnection</a> * <a name="l01129"></a><a class="code" href="group__DBusConnection.html#a2">01129</a> dbus_connection_ref (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01130 { 01131 _dbus_return_val_if_fail (connection != NULL, NULL); 01132 01133 <font class="comment">/* The connection lock is better than the global</font> 01134 <font class="comment"> * lock in the atomic increment fallback</font> 01135 <font class="comment"> */</font> 01136 01137 <font class="preprocessor">#ifdef DBUS_HAVE_ATOMIC_INT</font> 01138 <font class="preprocessor"></font> _dbus_atomic_inc (&connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>); 01139 <font class="preprocessor">#else</font> 01140 <font class="preprocessor"></font> CONNECTION_LOCK (connection); 01141 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> > 0); 01142 01143 connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> += 1; 01144 CONNECTION_UNLOCK (connection); 01145 <font class="preprocessor">#endif</font> 01146 <font class="preprocessor"></font> 01147 <font class="keywordflow">return</font> connection; 01148 } 01149 01150 <font class="keyword">static</font> <font class="keywordtype">void</font> 01151 free_outgoing_message (<font class="keywordtype">void</font> *element, 01152 <font class="keywordtype">void</font> *data) 01153 { 01154 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message = element; 01155 <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection = data; 01156 01157 _dbus_message_remove_size_counter (message, 01158 connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>, 01159 NULL); 01160 dbus_message_unref (message); 01161 } 01162 01163 <font class="comment">/* This is run without the mutex held, but after the last reference</font> 01164 <font class="comment"> * to the connection has been dropped we should have no thread-related</font> 01165 <font class="comment"> * problems</font> 01166 <font class="comment"> */</font> 01167 <font class="keyword">static</font> <font class="keywordtype">void</font> 01168 _dbus_connection_last_unref (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01169 { 01170 <a class="code" href="structDBusList.html">DBusList</a> *link; 01171 01172 _dbus_verbose (<font class="stringliteral">"Finalizing connection %p\n"</font>, connection); 01173 01174 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> == 0); 01175 01176 <font class="comment">/* You have to disconnect the connection before unref:ing it. Otherwise</font> 01177 <font class="comment"> * you won't get the disconnected message.</font> 01178 <font class="comment"> */</font> 01179 _dbus_assert (!_dbus_transport_get_is_connected (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>)); 01180 01181 <font class="comment">/* ---- We're going to call various application callbacks here, hope it doesn't break anything... */</font> 01182 _dbus_object_tree_free_all_unlocked (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>); 01183 01184 dbus_connection_set_dispatch_status_function (connection, NULL, NULL, NULL); 01185 dbus_connection_set_wakeup_main_function (connection, NULL, NULL, NULL); 01186 dbus_connection_set_unix_user_function (connection, NULL, NULL, NULL); 01187 01188 _dbus_watch_list_free (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>); 01189 connection-><a class="code" href="structDBusConnection.html#m14">watches</a> = NULL; 01190 01191 _dbus_timeout_list_free (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>); 01192 connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a> = NULL; 01193 01194 _dbus_data_slot_list_free (&connection-><a class="code" href="structDBusConnection.html#m17">slot_list</a>); 01195 01196 link = _dbus_list_get_first_link (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>); 01197 <font class="keywordflow">while</font> (link != NULL) 01198 { 01199 DBusMessageFilter *filter = link-><a class="code" href="structDBusList.html#m2">data</a>; 01200 <a class="code" href="structDBusList.html">DBusList</a> *next = _dbus_list_get_next_link (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>, link); 01201 01202 filter-><a class="code" href="structDBusMessageFilter.html#m1">function</a> = NULL; 01203 _dbus_message_filter_unref (filter); <font class="comment">/* calls app callback */</font> 01204 link-><a class="code" href="structDBusList.html#m2">data</a> = NULL; 01205 01206 link = next; 01207 } 01208 _dbus_list_clear (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>); 01209 01210 <font class="comment">/* ---- Done with stuff that invokes application callbacks */</font> 01211 01212 _dbus_object_tree_unref (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>); 01213 01214 _dbus_hash_table_unref (connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a>); 01215 connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a> = NULL; 01216 01217 _dbus_list_clear (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>); 01218 01219 _dbus_list_foreach (&connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>, 01220 free_outgoing_message, 01221 connection); 01222 _dbus_list_clear (&connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>); 01223 01224 _dbus_list_foreach (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, 01225 (DBusForeachFunction) dbus_message_unref, 01226 NULL); 01227 _dbus_list_clear (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>); 01228 01229 _dbus_counter_unref (connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>); 01230 01231 _dbus_transport_unref (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 01232 01233 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>) 01234 { 01235 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message = connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>-><a class="code" href="structDBusList.html#m2">data</a>; 01236 dbus_message_unref (message); 01237 _dbus_list_free_link (connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>); 01238 } 01239 01240 _dbus_list_clear (&connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a>); 01241 01242 dbus_condvar_free (connection-><a class="code" href="structDBusConnection.html#m3">dispatch_cond</a>); 01243 dbus_condvar_free (connection-><a class="code" href="structDBusConnection.html#m5">io_path_cond</a>); 01244 dbus_condvar_free (connection-><a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>); 01245 01246 dbus_mutex_free (connection-><a class="code" href="structDBusConnection.html#m1">mutex</a>); 01247 01248 dbus_free (connection); 01249 } 01250 01262 <font class="keywordtype">void</font> <a name="l01263"></a><a class="code" href="group__DBusConnection.html#a4">01263</a> dbus_connection_unref (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01264 { 01265 dbus_bool_t last_unref; 01266 01267 _dbus_return_if_fail (connection != NULL); 01268 01269 <font class="comment">/* The connection lock is better than the global</font> 01270 <font class="comment"> * lock in the atomic increment fallback</font> 01271 <font class="comment"> */</font> 01272 01273 <font class="preprocessor">#ifdef DBUS_HAVE_ATOMIC_INT</font> 01274 <font class="preprocessor"></font> last_unref = (_dbus_atomic_dec (&connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>) == 1); 01275 <font class="preprocessor">#else</font> 01276 <font class="preprocessor"></font> CONNECTION_LOCK (connection); 01277 01278 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> > 0); 01279 01280 connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> -= 1; 01281 last_unref = (connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> == 0); 01282 01283 <font class="preprocessor">#if 0</font> 01284 <font class="preprocessor"></font> printf (<font class="stringliteral">"unref() connection %p count = %d\n"</font>, connection, connection-><a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a>); 01285 <font class="preprocessor">#endif</font> 01286 <font class="preprocessor"></font> 01287 CONNECTION_UNLOCK (connection); 01288 <font class="preprocessor">#endif</font> 01289 <font class="preprocessor"></font> 01290 <font class="keywordflow">if</font> (last_unref) 01291 _dbus_connection_last_unref (connection); 01292 } 01293 01307 <font class="keywordtype">void</font> <a name="l01308"></a><a class="code" href="group__DBusConnection.html#a5">01308</a> dbus_connection_disconnect (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01309 { 01310 DBusDispatchStatus status; 01311 01312 _dbus_return_if_fail (connection != NULL); 01313 01314 CONNECTION_LOCK (connection); 01315 _dbus_transport_disconnect (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 01316 01317 status = _dbus_connection_get_dispatch_status_unlocked (connection); 01318 01319 <font class="comment">/* this calls out to user code */</font> 01320 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 01321 } 01322 01323 <font class="keyword">static</font> dbus_bool_t 01324 _dbus_connection_get_is_connected_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01325 { 01326 <font class="keywordflow">return</font> _dbus_transport_get_is_connected (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 01327 } 01328 01339 dbus_bool_t <a name="l01340"></a><a class="code" href="group__DBusConnection.html#a7">01340</a> dbus_connection_get_is_connected (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01341 { 01342 dbus_bool_t res; 01343 01344 _dbus_return_val_if_fail (connection != NULL, FALSE); 01345 01346 CONNECTION_LOCK (connection); 01347 res = _dbus_connection_get_is_connected_unlocked (connection); 01348 CONNECTION_UNLOCK (connection); 01349 01350 <font class="keywordflow">return</font> res; 01351 } 01352 01361 dbus_bool_t <a name="l01362"></a><a class="code" href="group__DBusConnection.html#a8">01362</a> dbus_connection_get_is_authenticated (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01363 { 01364 dbus_bool_t res; 01365 01366 _dbus_return_val_if_fail (connection != NULL, FALSE); 01367 01368 CONNECTION_LOCK (connection); 01369 res = _dbus_transport_get_is_authenticated (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 01370 CONNECTION_UNLOCK (connection); 01371 01372 <font class="keywordflow">return</font> res; 01373 } 01374 01388 <font class="keywordtype">void</font> <a name="l01389"></a><a class="code" href="group__DBusConnection.html#a9">01389</a> dbus_connection_set_exit_on_disconnect (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01390 dbus_bool_t exit_on_disconnect) 01391 { 01392 _dbus_return_if_fail (connection != NULL); 01393 01394 CONNECTION_LOCK (connection); 01395 connection-><a class="code" href="structDBusConnection.html#m30">exit_on_disconnect</a> = exit_on_disconnect != FALSE; 01396 CONNECTION_UNLOCK (connection); 01397 } 01398 01399 <font class="keyword">static</font> <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a>* 01400 _dbus_connection_preallocate_send_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01401 { 01402 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated; 01403 01404 _dbus_return_val_if_fail (connection != NULL, NULL); 01405 01406 preallocated = dbus_new (<a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a>, 1); 01407 <font class="keywordflow">if</font> (preallocated == NULL) 01408 <font class="keywordflow">return</font> NULL; 01409 01410 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a> != NULL) 01411 { 01412 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a> = 01413 _dbus_list_pop_first_link (&connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a>); 01414 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>-><a class="code" href="structDBusList.html#m2">data</a> = NULL; 01415 } 01416 <font class="keywordflow">else</font> 01417 { 01418 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a> = _dbus_list_alloc_link (NULL); 01419 <font class="keywordflow">if</font> (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a> == NULL) 01420 <font class="keywordflow">goto</font> failed_0; 01421 } 01422 01423 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a> != NULL) 01424 { 01425 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a> = 01426 _dbus_list_pop_first_link (&connection-><a class="code" href="structDBusConnection.html#m28">link_cache</a>); 01427 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>-><a class="code" href="structDBusList.html#m2">data</a> = connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>; 01428 } 01429 <font class="keywordflow">else</font> 01430 { 01431 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a> = _dbus_list_alloc_link (connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>); 01432 <font class="keywordflow">if</font> (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a> == NULL) 01433 <font class="keywordflow">goto</font> failed_1; 01434 } 01435 01436 _dbus_counter_ref (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>-><a class="code" href="structDBusList.html#m2">data</a>); 01437 01438 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m0">connection</a> = connection; 01439 01440 <font class="keywordflow">return</font> preallocated; 01441 01442 failed_1: 01443 _dbus_list_free_link (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>); 01444 failed_0: 01445 dbus_free (preallocated); 01446 01447 <font class="keywordflow">return</font> NULL; 01448 } 01449 01459 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a>* <a name="l01460"></a><a class="code" href="group__DBusConnection.html#a11">01460</a> dbus_connection_preallocate_send (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 01461 { 01462 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated; 01463 01464 _dbus_return_val_if_fail (connection != NULL, NULL); 01465 01466 CONNECTION_LOCK (connection); 01467 01468 preallocated = 01469 _dbus_connection_preallocate_send_unlocked (connection); 01470 01471 CONNECTION_UNLOCK (connection); 01472 01473 <font class="keywordflow">return</font> preallocated; 01474 } 01475 01485 <font class="keywordtype">void</font> <a name="l01486"></a><a class="code" href="group__DBusConnection.html#a12">01486</a> dbus_connection_free_preallocated_send (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01487 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated) 01488 { 01489 _dbus_return_if_fail (connection != NULL); 01490 _dbus_return_if_fail (preallocated != NULL); 01491 _dbus_return_if_fail (connection == preallocated-><a class="code" href="structDBusPreallocatedSend.html#m0">connection</a>); 01492 01493 _dbus_list_free_link (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>); 01494 _dbus_counter_unref (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>-><a class="code" href="structDBusList.html#m2">data</a>); 01495 _dbus_list_free_link (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>); 01496 dbus_free (preallocated); 01497 } 01498 01499 <font class="keyword">static</font> <font class="keywordtype">void</font> 01500 _dbus_connection_send_preallocated_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01501 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated, 01502 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message, 01503 dbus_uint32_t *client_serial) 01504 { 01505 dbus_uint32_t serial; 01506 01507 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>-><a class="code" href="structDBusList.html#m2">data</a> = message; 01508 _dbus_list_prepend_link (&connection-><a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>, 01509 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>); 01510 01511 _dbus_message_add_size_counter_link (message, 01512 preallocated-><a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>); 01513 01514 dbus_free (preallocated); 01515 preallocated = NULL; 01516 01517 dbus_message_ref (message); 01518 01519 connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a> += 1; 01520 01521 _dbus_verbose (<font class="stringliteral">"Message %p (%d %s '%s') added to outgoing queue %p, %d pending to send\n"</font>, 01522 message, 01523 dbus_message_get_type (message), 01524 dbus_message_get_interface (message) ? 01525 dbus_message_get_interface (message) : 01526 "no interface", 01527 dbus_message_get_signature (message), 01528 connection, 01529 connection->n_outgoing); 01530 01531 <font class="keywordflow">if</font> (dbus_message_get_serial (message) == 0) 01532 { 01533 serial = _dbus_connection_get_next_client_serial (connection); 01534 _dbus_message_set_serial (message, serial); 01535 <font class="keywordflow">if</font> (client_serial) 01536 *client_serial = serial; 01537 } 01538 <font class="keywordflow">else</font> 01539 { 01540 <font class="keywordflow">if</font> (client_serial) 01541 *client_serial = dbus_message_get_serial (message); 01542 } 01543 01544 _dbus_message_lock (message); 01545 01546 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a> == 1) 01547 _dbus_transport_messages_pending (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 01548 connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a>); 01549 01550 _dbus_connection_wakeup_mainloop (connection); 01551 } 01552 01565 <font class="keywordtype">void</font> <a name="l01566"></a><a class="code" href="group__DBusConnection.html#a14">01566</a> dbus_connection_send_preallocated (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01567 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated, 01568 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message, 01569 dbus_uint32_t *client_serial) 01570 { 01571 _dbus_return_if_fail (connection != NULL); 01572 _dbus_return_if_fail (preallocated != NULL); 01573 _dbus_return_if_fail (message != NULL); 01574 _dbus_return_if_fail (preallocated-><a class="code" href="structDBusPreallocatedSend.html#m0">connection</a> == connection); 01575 _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL || 01576 (dbus_message_get_interface (message) != NULL && 01577 dbus_message_get_member (message) != NULL)); 01578 _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL || 01579 (dbus_message_get_interface (message) != NULL && 01580 dbus_message_get_member (message) != NULL)); 01581 01582 CONNECTION_LOCK (connection); 01583 _dbus_connection_send_preallocated_unlocked (connection, 01584 preallocated, 01585 message, client_serial); 01586 CONNECTION_UNLOCK (connection); 01587 } 01588 01589 <font class="keyword">static</font> dbus_bool_t 01590 _dbus_connection_send_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01591 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message, 01592 dbus_uint32_t *client_serial) 01593 { 01594 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated; 01595 01596 _dbus_assert (connection != NULL); 01597 _dbus_assert (message != NULL); 01598 01599 preallocated = _dbus_connection_preallocate_send_unlocked (connection); 01600 <font class="keywordflow">if</font> (preallocated == NULL) 01601 <font class="keywordflow">return</font> FALSE; 01602 01603 01604 _dbus_connection_send_preallocated_unlocked (connection, 01605 preallocated, 01606 message, 01607 client_serial); 01608 <font class="keywordflow">return</font> TRUE; 01609 } 01610 01629 dbus_bool_t <a name="l01630"></a><a class="code" href="group__DBusConnection.html#a16">01630</a> dbus_connection_send (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01631 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message, 01632 dbus_uint32_t *client_serial) 01633 { 01634 _dbus_return_val_if_fail (connection != NULL, FALSE); 01635 _dbus_return_val_if_fail (message != NULL, FALSE); 01636 01637 CONNECTION_LOCK (connection); 01638 01639 <font class="keywordflow">if</font> (!_dbus_connection_send_unlocked (connection, message, client_serial)) 01640 { 01641 CONNECTION_UNLOCK (connection); 01642 <font class="keywordflow">return</font> FALSE; 01643 } 01644 01645 CONNECTION_UNLOCK (connection); 01646 <font class="keywordflow">return</font> TRUE; 01647 } 01648 01649 <font class="keyword">static</font> dbus_bool_t 01650 reply_handler_timeout (<font class="keywordtype">void</font> *data) 01651 { 01652 <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection; 01653 DBusDispatchStatus status; 01654 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending = data; 01655 01656 connection = pending-><a class="code" href="structDBusPendingCall.html#m3">connection</a>; 01657 01658 CONNECTION_LOCK (connection); 01659 <font class="keywordflow">if</font> (pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>) 01660 { 01661 _dbus_connection_queue_synthesized_message_link (connection, 01662 pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>); 01663 pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a> = NULL; 01664 } 01665 01666 _dbus_connection_remove_timeout (connection, 01667 pending-><a class="code" href="structDBusPendingCall.html#m5">timeout</a>); 01668 pending-><a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = FALSE; 01669 01670 status = _dbus_connection_get_dispatch_status_unlocked (connection); 01671 01672 <font class="comment">/* Unlocks, and calls out to user code */</font> 01673 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 01674 01675 <font class="keywordflow">return</font> TRUE; 01676 } 01677 01715 dbus_bool_t <a name="l01716"></a><a class="code" href="group__DBusConnection.html#a18">01716</a> dbus_connection_send_with_reply (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01717 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message, 01718 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> **pending_return, 01719 <font class="keywordtype">int</font> timeout_milliseconds) 01720 { 01721 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending; 01722 <a class="code" href="structDBusMessage.html">DBusMessage</a> *reply; 01723 <a class="code" href="structDBusList.html">DBusList</a> *reply_link; 01724 dbus_int32_t serial = -1; 01725 01726 _dbus_return_val_if_fail (connection != NULL, FALSE); 01727 _dbus_return_val_if_fail (message != NULL, FALSE); 01728 _dbus_return_val_if_fail (timeout_milliseconds >= 0 || timeout_milliseconds == -1, FALSE); 01729 01730 <font class="keywordflow">if</font> (pending_return) 01731 *pending_return = NULL; 01732 01733 pending = _dbus_pending_call_new (connection, 01734 timeout_milliseconds, 01735 reply_handler_timeout); 01736 01737 <font class="keywordflow">if</font> (pending == NULL) 01738 <font class="keywordflow">return</font> FALSE; 01739 01740 CONNECTION_LOCK (connection); 01741 01742 <font class="comment">/* Assign a serial to the message */</font> 01743 <font class="keywordflow">if</font> (dbus_message_get_serial (message) == 0) 01744 { 01745 serial = _dbus_connection_get_next_client_serial (connection); 01746 _dbus_message_set_serial (message, serial); 01747 } 01748 01749 pending-><a class="code" href="structDBusPendingCall.html#m7">reply_serial</a> = serial; 01750 01751 reply = dbus_message_new_error (message, DBUS_ERROR_NO_REPLY, 01752 <font class="stringliteral">"No reply within specified time"</font>); 01753 <font class="keywordflow">if</font> (reply == NULL) 01754 <font class="keywordflow">goto</font> error; 01755 01756 reply_link = _dbus_list_alloc_link (reply); 01757 <font class="keywordflow">if</font> (reply_link == NULL) 01758 { 01759 CONNECTION_UNLOCK (connection); 01760 dbus_message_unref (reply); 01761 <font class="keywordflow">goto</font> error_unlocked; 01762 } 01763 01764 pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a> = reply_link; 01765 01766 <font class="comment">/* Insert the serial in the pending replies hash;</font> 01767 <font class="comment"> * hash takes a refcount on DBusPendingCall.</font> 01768 <font class="comment"> * Also, add the timeout.</font> 01769 <font class="comment"> */</font> 01770 <font class="keywordflow">if</font> (!_dbus_connection_attach_pending_call_unlocked (connection, 01771 pending)) 01772 <font class="keywordflow">goto</font> error; 01773 01774 <font class="keywordflow">if</font> (!_dbus_connection_send_unlocked (connection, message, NULL)) 01775 { 01776 _dbus_connection_detach_pending_call_and_unlock (connection, 01777 pending); 01778 <font class="keywordflow">goto</font> error_unlocked; 01779 } 01780 01781 <font class="keywordflow">if</font> (pending_return) 01782 *pending_return = pending; 01783 <font class="keywordflow">else</font> 01784 dbus_pending_call_unref (pending); 01785 01786 CONNECTION_UNLOCK (connection); 01787 01788 <font class="keywordflow">return</font> TRUE; 01789 01790 error: 01791 CONNECTION_UNLOCK (connection); 01792 error_unlocked: 01793 dbus_pending_call_unref (pending); 01794 <font class="keywordflow">return</font> FALSE; 01795 } 01796 01797 <font class="keyword">static</font> <a class="code" href="structDBusMessage.html">DBusMessage</a>* 01798 check_for_reply_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01799 dbus_uint32_t client_serial) 01800 { 01801 <a class="code" href="structDBusList.html">DBusList</a> *link; 01802 01803 link = _dbus_list_get_first_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>); 01804 01805 <font class="keywordflow">while</font> (link != NULL) 01806 { 01807 <a class="code" href="structDBusMessage.html">DBusMessage</a> *reply = link-><a class="code" href="structDBusList.html#m2">data</a>; 01808 01809 <font class="keywordflow">if</font> (dbus_message_get_reply_serial (reply) == client_serial) 01810 { 01811 _dbus_list_remove_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, link); 01812 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> -= 1; 01813 <font class="keywordflow">return</font> reply; 01814 } 01815 link = _dbus_list_get_next_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, link); 01816 } 01817 01818 <font class="keywordflow">return</font> NULL; 01819 } 01820 01838 <a class="code" href="structDBusMessage.html">DBusMessage</a>* <a name="l01839"></a><a class="code" href="group__DBusConnection.html#a58">01839</a> _dbus_connection_block_for_reply (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01840 dbus_uint32_t client_serial, 01841 <font class="keywordtype">int</font> timeout_milliseconds) 01842 { 01843 <font class="keywordtype">long</font> start_tv_sec, start_tv_usec; 01844 <font class="keywordtype">long</font> end_tv_sec, end_tv_usec; 01845 <font class="keywordtype">long</font> tv_sec, tv_usec; 01846 DBusDispatchStatus status; 01847 01848 _dbus_return_val_if_fail (connection != NULL, NULL); 01849 _dbus_return_val_if_fail (client_serial != 0, NULL); 01850 _dbus_return_val_if_fail (timeout_milliseconds >= 0 || timeout_milliseconds == -1, FALSE); 01851 01852 <font class="keywordflow">if</font> (timeout_milliseconds == -1) 01853 timeout_milliseconds = _DBUS_DEFAULT_TIMEOUT_VALUE; 01854 01855 <font class="comment">/* it would probably seem logical to pass in _DBUS_INT_MAX</font> 01856 <font class="comment"> * for infinite timeout, but then math below would get</font> 01857 <font class="comment"> * all overflow-prone, so smack that down.</font> 01858 <font class="comment"> */</font> 01859 <font class="keywordflow">if</font> (timeout_milliseconds > _DBUS_ONE_HOUR_IN_MILLISECONDS * 6) 01860 timeout_milliseconds = _DBUS_ONE_HOUR_IN_MILLISECONDS * 6; 01861 01862 <font class="comment">/* Flush message queue */</font> 01863 dbus_connection_flush (connection); 01864 01865 CONNECTION_LOCK (connection); 01866 01867 _dbus_get_current_time (&start_tv_sec, &start_tv_usec); 01868 end_tv_sec = start_tv_sec + timeout_milliseconds / 1000; 01869 end_tv_usec = start_tv_usec + (timeout_milliseconds % 1000) * 1000; 01870 end_tv_sec += end_tv_usec / _DBUS_USEC_PER_SECOND; 01871 end_tv_usec = end_tv_usec % _DBUS_USEC_PER_SECOND; 01872 01873 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block(): will block %d milliseconds for reply serial %u from %ld sec %ld usec to %ld sec %ld usec\n"</font>, 01874 timeout_milliseconds, 01875 client_serial, 01876 start_tv_sec, start_tv_usec, 01877 end_tv_sec, end_tv_usec); 01878 01879 <font class="comment">/* Now we wait... */</font> 01880 <font class="comment">/* THREAD TODO: This is busted. What if a dispatch() or pop_message</font> 01881 <font class="comment"> * gets the message before we do?</font> 01882 <font class="comment"> */</font> 01883 <font class="comment">/* always block at least once as we know we don't have the reply yet */</font> 01884 _dbus_connection_do_iteration (connection, 01885 DBUS_ITERATION_DO_READING | 01886 DBUS_ITERATION_BLOCK, 01887 timeout_milliseconds); 01888 01889 recheck_status: 01890 01891 <font class="comment">/* queue messages and get status */</font> 01892 status = _dbus_connection_get_dispatch_status_unlocked (connection); 01893 01894 <font class="keywordflow">if</font> (status == DBUS_DISPATCH_DATA_REMAINS) 01895 { 01896 <a class="code" href="structDBusMessage.html">DBusMessage</a> *reply; 01897 01898 reply = check_for_reply_unlocked (connection, client_serial); 01899 <font class="keywordflow">if</font> (reply != NULL) 01900 { 01901 status = _dbus_connection_get_dispatch_status_unlocked (connection); 01902 01903 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block(): got reply\n"</font>); 01904 01905 <font class="comment">/* Unlocks, and calls out to user code */</font> 01906 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 01907 01908 <font class="keywordflow">return</font> reply; 01909 } 01910 } 01911 01912 _dbus_get_current_time (&tv_sec, &tv_usec); 01913 01914 <font class="keywordflow">if</font> (!_dbus_connection_get_is_connected_unlocked (connection)) 01915 <font class="keywordflow">return</font> NULL; 01916 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (tv_sec < start_tv_sec) 01917 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block(): clock set backward\n"</font>); 01918 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a> == NULL) 01919 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block(): disconnected\n"</font>); 01920 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (tv_sec < end_tv_sec || 01921 (tv_sec == end_tv_sec && tv_usec < end_tv_usec)) 01922 { 01923 timeout_milliseconds = (end_tv_sec - tv_sec) * 1000 + 01924 (end_tv_usec - tv_usec) / 1000; 01925 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block(): %d milliseconds remain\n"</font>, timeout_milliseconds); 01926 _dbus_assert (timeout_milliseconds >= 0); 01927 01928 <font class="keywordflow">if</font> (status == DBUS_DISPATCH_NEED_MEMORY) 01929 { 01930 <font class="comment">/* Try sleeping a bit, as we aren't sure we need to block for reading,</font> 01931 <font class="comment"> * we may already have a reply in the buffer and just can't process</font> 01932 <font class="comment"> * it.</font> 01933 <font class="comment"> */</font> 01934 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block() waiting for more memory\n"</font>); 01935 01936 <font class="keywordflow">if</font> (timeout_milliseconds < 100) 01937 ; <font class="comment">/* just busy loop */</font> 01938 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (timeout_milliseconds <= 1000) 01939 _dbus_sleep_milliseconds (timeout_milliseconds / 3); 01940 <font class="keywordflow">else</font> 01941 _dbus_sleep_milliseconds (1000); 01942 } 01943 <font class="keywordflow">else</font> 01944 { 01945 <font class="comment">/* block again, we don't have the reply buffered yet. */</font> 01946 _dbus_connection_do_iteration (connection, 01947 DBUS_ITERATION_DO_READING | 01948 DBUS_ITERATION_BLOCK, 01949 timeout_milliseconds); 01950 } 01951 01952 <font class="keywordflow">goto</font> recheck_status; 01953 } 01954 01955 _dbus_verbose (<font class="stringliteral">"dbus_connection_send_with_reply_and_block(): Waited %ld milliseconds and got no reply\n"</font>, 01956 (tv_sec - start_tv_sec) * 1000 + (tv_usec - start_tv_usec) / 1000); 01957 01958 <font class="comment">/* unlocks and calls out to user code */</font> 01959 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 01960 01961 <font class="keywordflow">return</font> NULL; 01962 } 01963 01986 <a class="code" href="structDBusMessage.html">DBusMessage</a> * <a name="l01987"></a><a class="code" href="group__DBusConnection.html#a21">01987</a> dbus_connection_send_with_reply_and_block (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 01988 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message, 01989 <font class="keywordtype">int</font> timeout_milliseconds, 01990 <a class="code" href="structDBusError.html">DBusError</a> *error) 01991 { 01992 dbus_uint32_t client_serial; 01993 <a class="code" href="structDBusMessage.html">DBusMessage</a> *reply; 01994 01995 _dbus_return_val_if_fail (connection != NULL, NULL); 01996 _dbus_return_val_if_fail (message != NULL, NULL); 01997 _dbus_return_val_if_fail (timeout_milliseconds >= 0 || timeout_milliseconds == -1, FALSE); 01998 _dbus_return_val_if_error_is_set (error, NULL); 01999 02000 <font class="keywordflow">if</font> (!dbus_connection_send (connection, message, &client_serial)) 02001 { 02002 _DBUS_SET_OOM (error); 02003 <font class="keywordflow">return</font> NULL; 02004 } 02005 02006 reply = _dbus_connection_block_for_reply (connection, 02007 client_serial, 02008 timeout_milliseconds); 02009 02010 <font class="keywordflow">if</font> (reply == NULL) 02011 { 02012 <font class="keywordflow">if</font> (dbus_connection_get_is_connected (connection)) 02013 dbus_set_error (error, DBUS_ERROR_NO_REPLY, <font class="stringliteral">"Message did not receive a reply"</font>); 02014 <font class="keywordflow">else</font> 02015 dbus_set_error (error, DBUS_ERROR_DISCONNECTED, <font class="stringliteral">"Disconnected prior to receiving a reply"</font>); 02016 02017 <font class="keywordflow">return</font> NULL; 02018 } 02019 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (dbus_set_error_from_message (error, reply)) 02020 { 02021 dbus_message_unref (reply); 02022 <font class="keywordflow">return</font> NULL; 02023 } 02024 <font class="keywordflow">else</font> 02025 <font class="keywordflow">return</font> reply; 02026 } 02027 02033 <font class="keywordtype">void</font> <a name="l02034"></a><a class="code" href="group__DBusConnection.html#a22">02034</a> dbus_connection_flush (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02035 { 02036 <font class="comment">/* We have to specify DBUS_ITERATION_DO_READING here because</font> 02037 <font class="comment"> * otherwise we could have two apps deadlock if they are both doing</font> 02038 <font class="comment"> * a flush(), and the kernel buffers fill up. This could change the</font> 02039 <font class="comment"> * dispatch status.</font> 02040 <font class="comment"> */</font> 02041 DBusDispatchStatus status; 02042 02043 _dbus_return_if_fail (connection != NULL); 02044 02045 CONNECTION_LOCK (connection); 02046 <font class="keywordflow">while</font> (connection-><a class="code" href="structDBusConnection.html#m10">n_outgoing</a> > 0 && 02047 _dbus_connection_get_is_connected_unlocked (connection)) 02048 _dbus_connection_do_iteration (connection, 02049 DBUS_ITERATION_DO_READING | 02050 DBUS_ITERATION_DO_WRITING | 02051 DBUS_ITERATION_BLOCK, 02052 -1); 02053 02054 status = _dbus_connection_get_dispatch_status_unlocked (connection); 02055 02056 <font class="comment">/* Unlocks and calls out to user code */</font> 02057 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 02058 } 02059 02060 <font class="comment">/* Call with mutex held. Will drop it while waiting and re-acquire</font> 02061 <font class="comment"> * before returning</font> 02062 <font class="comment"> */</font> 02063 <font class="keyword">static</font> <font class="keywordtype">void</font> 02064 _dbus_connection_wait_for_borrowed (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02065 { 02066 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> != NULL); 02067 02068 <font class="keywordflow">while</font> (connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> != NULL) 02069 dbus_condvar_wait (connection-><a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>, connection-><a class="code" href="structDBusConnection.html#m1">mutex</a>); 02070 } 02071 02086 <a class="code" href="structDBusMessage.html">DBusMessage</a>* <a name="l02087"></a><a class="code" href="group__DBusConnection.html#a24">02087</a> dbus_connection_borrow_message (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02088 { 02089 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message; 02090 DBusDispatchStatus status; 02091 02092 _dbus_return_val_if_fail (connection != NULL, NULL); 02093 <font class="comment">/* can't borrow during dispatch */</font> 02094 _dbus_return_val_if_fail (!connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>, NULL); 02095 02096 <font class="comment">/* this is called for the side effect that it queues</font> 02097 <font class="comment"> * up any messages from the transport</font> 02098 <font class="comment"> */</font> 02099 status = dbus_connection_get_dispatch_status (connection); 02100 <font class="keywordflow">if</font> (status != DBUS_DISPATCH_DATA_REMAINS) 02101 <font class="keywordflow">return</font> NULL; 02102 02103 CONNECTION_LOCK (connection); 02104 02105 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> != NULL) 02106 _dbus_connection_wait_for_borrowed (connection); 02107 02108 message = _dbus_list_get_first (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>); 02109 02110 <font class="keywordflow">if</font> (message) 02111 connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> = message; 02112 02113 CONNECTION_UNLOCK (connection); 02114 <font class="keywordflow">return</font> message; 02115 } 02116 02124 <font class="keywordtype">void</font> <a name="l02125"></a><a class="code" href="group__DBusConnection.html#a25">02125</a> dbus_connection_return_message (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02126 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message) 02127 { 02128 _dbus_return_if_fail (connection != NULL); 02129 _dbus_return_if_fail (message != NULL); 02130 <font class="comment">/* can't borrow during dispatch */</font> 02131 _dbus_return_if_fail (!connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>); 02132 02133 CONNECTION_LOCK (connection); 02134 02135 _dbus_assert (message == connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a>); 02136 02137 connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> = NULL; 02138 dbus_condvar_wake_all (connection-><a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>); 02139 02140 CONNECTION_UNLOCK (connection); 02141 } 02142 02152 <font class="keywordtype">void</font> <a name="l02153"></a><a class="code" href="group__DBusConnection.html#a26">02153</a> dbus_connection_steal_borrowed_message (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02154 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message) 02155 { 02156 <a class="code" href="structDBusMessage.html">DBusMessage</a> *pop_message; 02157 02158 _dbus_return_if_fail (connection != NULL); 02159 _dbus_return_if_fail (message != NULL); 02160 <font class="comment">/* can't borrow during dispatch */</font> 02161 _dbus_return_if_fail (!connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>); 02162 02163 CONNECTION_LOCK (connection); 02164 02165 _dbus_assert (message == connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a>); 02166 02167 pop_message = _dbus_list_pop_first (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>); 02168 _dbus_assert (message == pop_message); 02169 02170 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> -= 1; 02171 02172 _dbus_verbose (<font class="stringliteral">"Incoming message %p stolen from queue, %d incoming\n"</font>, 02173 message, connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a>); 02174 02175 connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> = NULL; 02176 dbus_condvar_wake_all (connection-><a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>); 02177 02178 CONNECTION_UNLOCK (connection); 02179 } 02180 02181 <font class="comment">/* See dbus_connection_pop_message, but requires the caller to own</font> 02182 <font class="comment"> * the lock before calling. May drop the lock while running.</font> 02183 <font class="comment"> */</font> 02184 <font class="keyword">static</font> <a class="code" href="structDBusList.html">DBusList</a>* 02185 _dbus_connection_pop_message_link_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02186 { 02187 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> != NULL) 02188 _dbus_connection_wait_for_borrowed (connection); 02189 02190 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> > 0) 02191 { 02192 <a class="code" href="structDBusList.html">DBusList</a> *link; 02193 02194 link = _dbus_list_pop_first_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>); 02195 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> -= 1; 02196 02197 _dbus_verbose (<font class="stringliteral">"Message %p (%d %s '%s') removed from incoming queue %p, %d incoming\n"</font>, 02198 link-><a class="code" href="structDBusList.html#m2">data</a>, 02199 dbus_message_get_type (link-><a class="code" href="structDBusList.html#m2">data</a>), 02200 dbus_message_get_interface (link-><a class="code" href="structDBusList.html#m2">data</a>) ? 02201 dbus_message_get_interface (link-><a class="code" href="structDBusList.html#m2">data</a>) : 02202 "no interface", 02203 dbus_message_get_signature (link->data), 02204 connection, connection->n_incoming); 02205 02206 <font class="keywordflow">return</font> link; 02207 } 02208 <font class="keywordflow">else</font> 02209 <font class="keywordflow">return</font> NULL; 02210 } 02211 02212 <font class="comment">/* See dbus_connection_pop_message, but requires the caller to own</font> 02213 <font class="comment"> * the lock before calling. May drop the lock while running.</font> 02214 <font class="comment"> */</font> 02215 <font class="keyword">static</font> <a class="code" href="structDBusMessage.html">DBusMessage</a>* 02216 _dbus_connection_pop_message_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02217 { 02218 <a class="code" href="structDBusList.html">DBusList</a> *link; 02219 02220 link = _dbus_connection_pop_message_link_unlocked (connection); 02221 02222 <font class="keywordflow">if</font> (link != NULL) 02223 { 02224 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message; 02225 02226 message = link-><a class="code" href="structDBusList.html#m2">data</a>; 02227 02228 _dbus_list_free_link (link); 02229 02230 <font class="keywordflow">return</font> message; 02231 } 02232 <font class="keywordflow">else</font> 02233 <font class="keywordflow">return</font> NULL; 02234 } 02235 02236 <font class="keyword">static</font> <font class="keywordtype">void</font> 02237 _dbus_connection_putback_message_link_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02238 <a class="code" href="structDBusList.html">DBusList</a> *message_link) 02239 { 02240 _dbus_assert (message_link != NULL); 02241 <font class="comment">/* You can't borrow a message while a link is outstanding */</font> 02242 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m8">message_borrowed</a> == NULL); 02243 02244 _dbus_list_prepend_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, 02245 message_link); 02246 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> += 1; 02247 02248 _dbus_verbose (<font class="stringliteral">"Message %p (%d %s '%s') put back into queue %p, %d incoming\n"</font>, 02249 message_link-><a class="code" href="structDBusList.html#m2">data</a>, 02250 dbus_message_get_type (message_link-><a class="code" href="structDBusList.html#m2">data</a>), 02251 dbus_message_get_interface (message_link-><a class="code" href="structDBusList.html#m2">data</a>) ? 02252 dbus_message_get_interface (message_link-><a class="code" href="structDBusList.html#m2">data</a>) : 02253 "no interface", 02254 dbus_message_get_signature (message_link->data), 02255 connection, connection->n_incoming); 02256 } 02257 02272 <a class="code" href="structDBusMessage.html">DBusMessage</a>* <a name="l02273"></a><a class="code" href="group__DBusConnection.html#a30">02273</a> dbus_connection_pop_message (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02274 { 02275 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message; 02276 DBusDispatchStatus status; 02277 02278 <font class="comment">/* this is called for the side effect that it queues</font> 02279 <font class="comment"> * up any messages from the transport</font> 02280 <font class="comment"> */</font> 02281 status = dbus_connection_get_dispatch_status (connection); 02282 <font class="keywordflow">if</font> (status != DBUS_DISPATCH_DATA_REMAINS) 02283 <font class="keywordflow">return</font> NULL; 02284 02285 CONNECTION_LOCK (connection); 02286 02287 message = _dbus_connection_pop_message_unlocked (connection); 02288 02289 _dbus_verbose (<font class="stringliteral">"Returning popped message %p\n"</font>, message); 02290 02291 CONNECTION_UNLOCK (connection); 02292 02293 <font class="keywordflow">return</font> message; 02294 } 02295 02304 <font class="keyword">static</font> <font class="keywordtype">void</font> 02305 _dbus_connection_acquire_dispatch (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02306 { 02307 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>) 02308 dbus_condvar_wait (connection-><a class="code" href="structDBusConnection.html#m3">dispatch_cond</a>, connection-><a class="code" href="structDBusConnection.html#m1">mutex</a>); 02309 _dbus_assert (!connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>); 02310 02311 connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a> = TRUE; 02312 } 02313 02321 <font class="keyword">static</font> <font class="keywordtype">void</font> 02322 _dbus_connection_release_dispatch (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02323 { 02324 _dbus_assert (connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>); 02325 02326 connection-><a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a> = FALSE; 02327 dbus_condvar_wake_one (connection-><a class="code" href="structDBusConnection.html#m3">dispatch_cond</a>); 02328 } 02329 02330 <font class="keyword">static</font> <font class="keywordtype">void</font> 02331 _dbus_connection_failed_pop (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02332 <a class="code" href="structDBusList.html">DBusList</a> *message_link) 02333 { 02334 _dbus_list_prepend_link (&connection-><a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, 02335 message_link); 02336 connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> += 1; 02337 } 02338 02339 <font class="keyword">static</font> DBusDispatchStatus 02340 _dbus_connection_get_dispatch_status_unlocked (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02341 { 02342 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> > 0) 02343 <font class="keywordflow">return</font> DBUS_DISPATCH_DATA_REMAINS; 02344 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (!_dbus_transport_queue_messages (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>)) 02345 <font class="keywordflow">return</font> DBUS_DISPATCH_NEED_MEMORY; 02346 <font class="keywordflow">else</font> 02347 { 02348 DBusDispatchStatus status; 02349 02350 status = _dbus_transport_get_dispatch_status (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 02351 02352 <font class="keywordflow">if</font> (status == DBUS_DISPATCH_COMPLETE && 02353 connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a> && 02354 !_dbus_transport_get_is_connected (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>)) 02355 { 02356 <font class="comment">/* We haven't sent the disconnect message already,</font> 02357 <font class="comment"> * and all real messages have been queued up.</font> 02358 <font class="comment"> */</font> 02359 _dbus_connection_queue_synthesized_message_link (connection, 02360 connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>); 02361 connection-><a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a> = NULL; 02362 } 02363 02364 <font class="keywordflow">if</font> (status != DBUS_DISPATCH_COMPLETE) 02365 <font class="keywordflow">return</font> status; 02366 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m11">n_incoming</a> > 0) 02367 <font class="keywordflow">return</font> DBUS_DISPATCH_DATA_REMAINS; 02368 <font class="keywordflow">else</font> 02369 <font class="keywordflow">return</font> DBUS_DISPATCH_COMPLETE; 02370 } 02371 } 02372 02373 <font class="keyword">static</font> <font class="keywordtype">void</font> 02374 _dbus_connection_update_dispatch_status_and_unlock (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02375 DBusDispatchStatus new_status) 02376 { 02377 dbus_bool_t changed; 02378 DBusDispatchStatusFunction function; 02379 <font class="keywordtype">void</font> *data; 02380 02381 <font class="comment">/* We have the lock */</font> 02382 02383 _dbus_connection_ref_unlocked (connection); 02384 02385 changed = new_status != connection-><a class="code" href="structDBusConnection.html#m27">last_dispatch_status</a>; 02386 02387 connection-><a class="code" href="structDBusConnection.html#m27">last_dispatch_status</a> = new_status; 02388 02389 function = connection-><a class="code" href="structDBusConnection.html#m24">dispatch_status_function</a>; 02390 data = connection-><a class="code" href="structDBusConnection.html#m25">dispatch_status_data</a>; 02391 02392 <font class="comment">/* We drop the lock */</font> 02393 CONNECTION_UNLOCK (connection); 02394 02395 <font class="keywordflow">if</font> (changed && function) 02396 { 02397 _dbus_verbose (<font class="stringliteral">"Notifying of change to dispatch status of %p now %d (%s)\n"</font>, 02398 connection, new_status, 02399 new_status == DBUS_DISPATCH_COMPLETE ? <font class="stringliteral">"complete"</font> : 02400 new_status == DBUS_DISPATCH_DATA_REMAINS ? <font class="stringliteral">"data remains"</font> : 02401 new_status == DBUS_DISPATCH_NEED_MEMORY ? <font class="stringliteral">"need memory"</font> : 02402 <font class="stringliteral">"???"</font>); 02403 (* function) (connection, new_status, data); 02404 } 02405 02406 dbus_connection_unref (connection); 02407 } 02408 02417 DBusDispatchStatus <a name="l02418"></a><a class="code" href="group__DBusConnection.html#a34">02418</a> dbus_connection_get_dispatch_status (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02419 { 02420 DBusDispatchStatus status; 02421 02422 _dbus_return_val_if_fail (connection != NULL, DBUS_DISPATCH_COMPLETE); 02423 02424 CONNECTION_LOCK (connection); 02425 02426 status = _dbus_connection_get_dispatch_status_unlocked (connection); 02427 02428 CONNECTION_UNLOCK (connection); 02429 02430 <font class="keywordflow">return</font> status; 02431 } 02432 02460 DBusDispatchStatus <a name="l02461"></a><a class="code" href="group__DBusConnection.html#a35">02461</a> dbus_connection_dispatch (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 02462 { 02463 <a class="code" href="structDBusMessage.html">DBusMessage</a> *message; 02464 <a class="code" href="structDBusList.html">DBusList</a> *link, *filter_list_copy, *message_link; 02465 DBusHandlerResult result; 02466 <a class="code" href="structDBusPendingCall.html">DBusPendingCall</a> *pending; 02467 dbus_int32_t reply_serial; 02468 DBusDispatchStatus status; 02469 02470 _dbus_return_val_if_fail (connection != NULL, DBUS_DISPATCH_COMPLETE); 02471 02472 CONNECTION_LOCK (connection); 02473 status = _dbus_connection_get_dispatch_status_unlocked (connection); 02474 <font class="keywordflow">if</font> (status != DBUS_DISPATCH_DATA_REMAINS) 02475 { 02476 <font class="comment">/* unlocks and calls out to user code */</font> 02477 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 02478 <font class="keywordflow">return</font> status; 02479 } 02480 02481 <font class="comment">/* We need to ref the connection since the callback could potentially</font> 02482 <font class="comment"> * drop the last ref to it</font> 02483 <font class="comment"> */</font> 02484 _dbus_connection_ref_unlocked (connection); 02485 02486 _dbus_connection_acquire_dispatch (connection); 02487 02488 <font class="comment">/* This call may drop the lock during the execution (if waiting for</font> 02489 <font class="comment"> * borrowed messages to be returned) but the order of message</font> 02490 <font class="comment"> * dispatch if several threads call dispatch() is still</font> 02491 <font class="comment"> * protected by the lock, since only one will get the lock, and that</font> 02492 <font class="comment"> * one will finish the message dispatching</font> 02493 <font class="comment"> */</font> 02494 message_link = _dbus_connection_pop_message_link_unlocked (connection); 02495 <font class="keywordflow">if</font> (message_link == NULL) 02496 { 02497 <font class="comment">/* another thread dispatched our stuff */</font> 02498 02499 _dbus_connection_release_dispatch (connection); 02500 02501 status = _dbus_connection_get_dispatch_status_unlocked (connection); 02502 02503 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 02504 02505 dbus_connection_unref (connection); 02506 02507 <font class="keywordflow">return</font> status; 02508 } 02509 02510 message = message_link-><a class="code" href="structDBusList.html#m2">data</a>; 02511 02512 result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 02513 02514 reply_serial = dbus_message_get_reply_serial (message); 02515 pending = _dbus_hash_table_lookup_int (connection-><a class="code" href="structDBusConnection.html#m18">pending_replies</a>, 02516 reply_serial); 02517 02518 <font class="keywordflow">if</font> (!_dbus_list_copy (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>, &filter_list_copy)) 02519 { 02520 _dbus_connection_release_dispatch (connection); 02521 02522 _dbus_connection_failed_pop (connection, message_link); 02523 02524 <font class="comment">/* unlocks and calls user code */</font> 02525 _dbus_connection_update_dispatch_status_and_unlock (connection, 02526 DBUS_DISPATCH_NEED_MEMORY); 02527 02528 dbus_connection_unref (connection); 02529 02530 <font class="keywordflow">return</font> DBUS_DISPATCH_NEED_MEMORY; 02531 } 02532 02533 _dbus_list_foreach (&filter_list_copy, 02534 (DBusForeachFunction)_dbus_message_filter_ref, 02535 NULL); 02536 02537 <font class="comment">/* We're still protected from dispatch() reentrancy here</font> 02538 <font class="comment"> * since we acquired the dispatcher</font> 02539 <font class="comment"> */</font> 02540 CONNECTION_UNLOCK (connection); 02541 02542 link = _dbus_list_get_first_link (&filter_list_copy); 02543 <font class="keywordflow">while</font> (link != NULL) 02544 { 02545 DBusMessageFilter *filter = link-><a class="code" href="structDBusList.html#m2">data</a>; 02546 <a class="code" href="structDBusList.html">DBusList</a> *next = _dbus_list_get_next_link (&filter_list_copy, link); 02547 02548 _dbus_verbose (<font class="stringliteral">" running filter on message %p\n"</font>, message); 02549 result = (* filter-><a class="code" href="structDBusMessageFilter.html#m1">function</a>) (connection, message, filter-><a class="code" href="structDBusMessageFilter.html#m2">user_data</a>); 02550 02551 <font class="keywordflow">if</font> (result != DBUS_HANDLER_RESULT_NOT_YET_HANDLED) 02552 <font class="keywordflow">break</font>; 02553 02554 link = next; 02555 } 02556 02557 _dbus_list_foreach (&filter_list_copy, 02558 (DBusForeachFunction)_dbus_message_filter_unref, 02559 NULL); 02560 _dbus_list_clear (&filter_list_copy); 02561 02562 CONNECTION_LOCK (connection); 02563 02564 <font class="keywordflow">if</font> (result == DBUS_HANDLER_RESULT_NEED_MEMORY) 02565 <font class="keywordflow">goto</font> out; 02566 02567 <font class="comment">/* Did a reply we were waiting on get filtered? */</font> 02568 <font class="keywordflow">if</font> (pending && result == DBUS_HANDLER_RESULT_HANDLED) 02569 { 02570 <font class="comment">/* Queue the timeout immediately! */</font> 02571 <font class="keywordflow">if</font> (pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>) 02572 { 02573 _dbus_connection_queue_synthesized_message_link (connection, 02574 pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>); 02575 pending-><a class="code" href="structDBusPendingCall.html#m6">timeout_link</a> = NULL; 02576 } 02577 <font class="keywordflow">else</font> 02578 { 02579 <font class="comment">/* We already queued the timeout? Then it was filtered! */</font> 02580 _dbus_warn (<font class="stringliteral">"The timeout error with reply serial %d was filtered, so the DBusPendingCall will never stop pending.\n"</font>, reply_serial); 02581 } 02582 } 02583 02584 <font class="keywordflow">if</font> (result == DBUS_HANDLER_RESULT_HANDLED) 02585 <font class="keywordflow">goto</font> out; 02586 02587 <font class="keywordflow">if</font> (pending) 02588 { 02589 _dbus_pending_call_complete_and_unlock (pending, message); 02590 02591 pending = NULL; 02592 02593 CONNECTION_LOCK (connection); 02594 <font class="keywordflow">goto</font> out; 02595 } 02596 02597 <font class="comment">/* We're still protected from dispatch() reentrancy here</font> 02598 <font class="comment"> * since we acquired the dispatcher</font> 02599 <font class="comment"> */</font> 02600 _dbus_verbose (<font class="stringliteral">" running object path dispatch on message %p (%d %s '%s')\n"</font>, 02601 message, 02602 dbus_message_get_type (message), 02603 dbus_message_get_interface (message) ? 02604 dbus_message_get_interface (message) : 02605 <font class="stringliteral">"no interface"</font>, 02606 dbus_message_get_signature (message)); 02607 02608 result = _dbus_object_tree_dispatch_and_unlock (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>, 02609 message); 02610 02611 CONNECTION_LOCK (connection); 02612 02613 <font class="keywordflow">if</font> (result != DBUS_HANDLER_RESULT_NOT_YET_HANDLED) 02614 <font class="keywordflow">goto</font> out; 02615 02616 <font class="keywordflow">if</font> (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_CALL) 02617 { 02618 <a class="code" href="structDBusMessage.html">DBusMessage</a> *reply; 02619 <a class="code" href="structDBusString.html">DBusString</a> str; 02620 <a class="code" href="structDBusPreallocatedSend.html">DBusPreallocatedSend</a> *preallocated; 02621 02622 _dbus_verbose (<font class="stringliteral">" sending error %s\n"</font>, 02623 DBUS_ERROR_UNKNOWN_METHOD); 02624 02625 <font class="keywordflow">if</font> (!_dbus_string_init (&str)) 02626 { 02627 result = DBUS_HANDLER_RESULT_NEED_MEMORY; 02628 <font class="keywordflow">goto</font> out; 02629 } 02630 02631 <font class="keywordflow">if</font> (!_dbus_string_append_printf (&str, 02632 <font class="stringliteral">"Method \"%s\" on interface \"%s\" doesn't exist\n"</font>, 02633 dbus_message_get_member (message), 02634 dbus_message_get_interface (message))) 02635 { 02636 _dbus_string_free (&str); 02637 result = DBUS_HANDLER_RESULT_NEED_MEMORY; 02638 <font class="keywordflow">goto</font> out; 02639 } 02640 02641 reply = dbus_message_new_error (message, 02642 DBUS_ERROR_UNKNOWN_METHOD, 02643 _dbus_string_get_const_data (&str)); 02644 _dbus_string_free (&str); 02645 02646 <font class="keywordflow">if</font> (reply == NULL) 02647 { 02648 result = DBUS_HANDLER_RESULT_NEED_MEMORY; 02649 <font class="keywordflow">goto</font> out; 02650 } 02651 02652 preallocated = _dbus_connection_preallocate_send_unlocked (connection); 02653 02654 <font class="keywordflow">if</font> (preallocated == NULL) 02655 { 02656 dbus_message_unref (reply); 02657 result = DBUS_HANDLER_RESULT_NEED_MEMORY; 02658 <font class="keywordflow">goto</font> out; 02659 } 02660 02661 _dbus_connection_send_preallocated_unlocked (connection, preallocated, 02662 reply, NULL); 02663 02664 dbus_message_unref (reply); 02665 02666 result = DBUS_HANDLER_RESULT_HANDLED; 02667 } 02668 02669 _dbus_verbose (<font class="stringliteral">" done dispatching %p (%d %s '%s') on connection %p\n"</font>, message, 02670 dbus_message_get_type (message), 02671 dbus_message_get_interface (message) ? 02672 dbus_message_get_interface (message) : 02673 <font class="stringliteral">"no interface"</font>, 02674 dbus_message_get_signature (message), 02675 connection); 02676 02677 out: 02678 <font class="keywordflow">if</font> (result == DBUS_HANDLER_RESULT_NEED_MEMORY) 02679 { 02680 _dbus_verbose (<font class="stringliteral">"out of memory in %s\n"</font>, _DBUS_FUNCTION_NAME); 02681 02682 <font class="comment">/* Put message back, and we'll start over.</font> 02683 <font class="comment"> * Yes this means handlers must be idempotent if they</font> 02684 <font class="comment"> * don't return HANDLED; c'est la vie.</font> 02685 <font class="comment"> */</font> 02686 _dbus_connection_putback_message_link_unlocked (connection, 02687 message_link); 02688 } 02689 <font class="keywordflow">else</font> 02690 { 02691 _dbus_verbose (<font class="stringliteral">"Done with message in %s\n"</font>, _DBUS_FUNCTION_NAME); 02692 02693 <font class="keywordflow">if</font> (connection-><a class="code" href="structDBusConnection.html#m30">exit_on_disconnect</a> && 02694 dbus_message_is_signal (message, 02695 DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, 02696 <font class="stringliteral">"Disconnected"</font>)) 02697 { 02698 _dbus_verbose (<font class="stringliteral">"Exiting on Disconnected signal\n"</font>); 02699 CONNECTION_UNLOCK (connection); 02700 _dbus_exit (1); 02701 _dbus_assert_not_reached (<font class="stringliteral">"Call to exit() returned"</font>); 02702 } 02703 02704 _dbus_list_free_link (message_link); 02705 dbus_message_unref (message); <font class="comment">/* don't want the message to count in max message limits</font> 02706 <font class="comment"> * in computing dispatch status below</font> 02707 <font class="comment"> */</font> 02708 } 02709 02710 _dbus_connection_release_dispatch (connection); 02711 02712 status = _dbus_connection_get_dispatch_status_unlocked (connection); 02713 02714 <font class="comment">/* unlocks and calls user code */</font> 02715 _dbus_connection_update_dispatch_status_and_unlock (connection, status); 02716 02717 dbus_connection_unref (connection); 02718 02719 <font class="keywordflow">return</font> status; 02720 } 02721 02780 dbus_bool_t <a name="l02781"></a><a class="code" href="group__DBusConnection.html#a36">02781</a> dbus_connection_set_watch_functions (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02782 DBusAddWatchFunction add_function, 02783 DBusRemoveWatchFunction remove_function, 02784 DBusWatchToggledFunction toggled_function, 02785 <font class="keywordtype">void</font> *data, 02786 DBusFreeFunction free_data_function) 02787 { 02788 dbus_bool_t retval; 02789 02790 _dbus_return_val_if_fail (connection != NULL, FALSE); 02791 02792 CONNECTION_LOCK (connection); 02793 <font class="comment">/* ref connection for slightly better reentrancy */</font> 02794 _dbus_connection_ref_unlocked (connection); 02795 02796 <font class="comment">/* FIXME this can call back into user code, and we need to drop the</font> 02797 <font class="comment"> * connection lock when it does.</font> 02798 <font class="comment"> */</font> 02799 retval = _dbus_watch_list_set_functions (connection-><a class="code" href="structDBusConnection.html#m14">watches</a>, 02800 add_function, remove_function, 02801 toggled_function, 02802 data, free_data_function); 02803 02804 CONNECTION_UNLOCK (connection); 02805 <font class="comment">/* drop our paranoid refcount */</font> 02806 dbus_connection_unref (connection); 02807 02808 <font class="keywordflow">return</font> retval; 02809 } 02810 02844 dbus_bool_t <a name="l02845"></a><a class="code" href="group__DBusConnection.html#a37">02845</a> dbus_connection_set_timeout_functions (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02846 DBusAddTimeoutFunction add_function, 02847 DBusRemoveTimeoutFunction remove_function, 02848 DBusTimeoutToggledFunction toggled_function, 02849 <font class="keywordtype">void</font> *data, 02850 DBusFreeFunction free_data_function) 02851 { 02852 dbus_bool_t retval; 02853 02854 _dbus_return_val_if_fail (connection != NULL, FALSE); 02855 02856 CONNECTION_LOCK (connection); 02857 <font class="comment">/* ref connection for slightly better reentrancy */</font> 02858 _dbus_connection_ref_unlocked (connection); 02859 02860 retval = _dbus_timeout_list_set_functions (connection-><a class="code" href="structDBusConnection.html#m15">timeouts</a>, 02861 add_function, remove_function, 02862 toggled_function, 02863 data, free_data_function); 02864 02865 CONNECTION_UNLOCK (connection); 02866 <font class="comment">/* drop our paranoid refcount */</font> 02867 dbus_connection_unref (connection); 02868 02869 <font class="keywordflow">return</font> retval; 02870 } 02871 02886 <font class="keywordtype">void</font> <a name="l02887"></a><a class="code" href="group__DBusConnection.html#a38">02887</a> dbus_connection_set_wakeup_main_function (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02888 DBusWakeupMainFunction wakeup_main_function, 02889 <font class="keywordtype">void</font> *data, 02890 DBusFreeFunction free_data_function) 02891 { 02892 <font class="keywordtype">void</font> *old_data; 02893 DBusFreeFunction old_free_data; 02894 02895 _dbus_return_if_fail (connection != NULL); 02896 02897 CONNECTION_LOCK (connection); 02898 old_data = connection-><a class="code" href="structDBusConnection.html#m22">wakeup_main_data</a>; 02899 old_free_data = connection-><a class="code" href="structDBusConnection.html#m23">free_wakeup_main_data</a>; 02900 02901 connection-><a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a> = wakeup_main_function; 02902 connection-><a class="code" href="structDBusConnection.html#m22">wakeup_main_data</a> = data; 02903 connection-><a class="code" href="structDBusConnection.html#m23">free_wakeup_main_data</a> = free_data_function; 02904 02905 CONNECTION_UNLOCK (connection); 02906 02907 <font class="comment">/* Callback outside the lock */</font> 02908 <font class="keywordflow">if</font> (old_free_data) 02909 (*old_free_data) (old_data); 02910 } 02911 02928 <font class="keywordtype">void</font> <a name="l02929"></a><a class="code" href="group__DBusConnection.html#a39">02929</a> dbus_connection_set_dispatch_status_function (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02930 DBusDispatchStatusFunction function, 02931 <font class="keywordtype">void</font> *data, 02932 DBusFreeFunction free_data_function) 02933 { 02934 <font class="keywordtype">void</font> *old_data; 02935 DBusFreeFunction old_free_data; 02936 02937 _dbus_return_if_fail (connection != NULL); 02938 02939 CONNECTION_LOCK (connection); 02940 old_data = connection-><a class="code" href="structDBusConnection.html#m25">dispatch_status_data</a>; 02941 old_free_data = connection-><a class="code" href="structDBusConnection.html#m26">free_dispatch_status_data</a>; 02942 02943 connection-><a class="code" href="structDBusConnection.html#m24">dispatch_status_function</a> = function; 02944 connection-><a class="code" href="structDBusConnection.html#m25">dispatch_status_data</a> = data; 02945 connection-><a class="code" href="structDBusConnection.html#m26">free_dispatch_status_data</a> = free_data_function; 02946 02947 CONNECTION_UNLOCK (connection); 02948 02949 <font class="comment">/* Callback outside the lock */</font> 02950 <font class="keywordflow">if</font> (old_free_data) 02951 (*old_free_data) (old_data); 02952 } 02953 02965 dbus_bool_t <a name="l02966"></a><a class="code" href="group__DBusConnection.html#a40">02966</a> dbus_connection_get_unix_user (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 02967 <font class="keywordtype">unsigned</font> <font class="keywordtype">long</font> *uid) 02968 { 02969 dbus_bool_t result; 02970 02971 _dbus_return_val_if_fail (connection != NULL, FALSE); 02972 _dbus_return_val_if_fail (uid != NULL, FALSE); 02973 02974 CONNECTION_LOCK (connection); 02975 02976 <font class="keywordflow">if</font> (!_dbus_transport_get_is_authenticated (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>)) 02977 result = FALSE; 02978 <font class="keywordflow">else</font> 02979 result = _dbus_transport_get_unix_user (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 02980 uid); 02981 CONNECTION_UNLOCK (connection); 02982 02983 <font class="keywordflow">return</font> result; 02984 } 02985 03002 <font class="keywordtype">void</font> <a name="l03003"></a><a class="code" href="group__DBusConnection.html#a41">03003</a> dbus_connection_set_unix_user_function (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03004 DBusAllowUnixUserFunction function, 03005 <font class="keywordtype">void</font> *data, 03006 DBusFreeFunction free_data_function) 03007 { 03008 <font class="keywordtype">void</font> *old_data = NULL; 03009 DBusFreeFunction old_free_function = NULL; 03010 03011 _dbus_return_if_fail (connection != NULL); 03012 03013 CONNECTION_LOCK (connection); 03014 _dbus_transport_set_unix_user_function (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 03015 function, data, free_data_function, 03016 &old_data, &old_free_function); 03017 CONNECTION_UNLOCK (connection); 03018 03019 <font class="keywordflow">if</font> (old_free_function != NULL) 03020 (* old_free_function) (old_data); 03021 } 03022 03044 dbus_bool_t <a name="l03045"></a><a class="code" href="group__DBusConnection.html#a42">03045</a> dbus_connection_add_filter (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03046 DBusHandleMessageFunction function, 03047 <font class="keywordtype">void</font> *user_data, 03048 DBusFreeFunction free_data_function) 03049 { 03050 DBusMessageFilter *filter; 03051 03052 _dbus_return_val_if_fail (connection != NULL, FALSE); 03053 _dbus_return_val_if_fail (function != NULL, FALSE); 03054 03055 filter = dbus_new0 (DBusMessageFilter, 1); 03056 <font class="keywordflow">if</font> (filter == NULL) 03057 <font class="keywordflow">return</font> FALSE; 03058 03059 filter-><a class="code" href="structDBusMessageFilter.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1; 03060 03061 CONNECTION_LOCK (connection); 03062 03063 <font class="keywordflow">if</font> (!_dbus_list_append (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>, 03064 filter)) 03065 { 03066 _dbus_message_filter_unref (filter); 03067 CONNECTION_UNLOCK (connection); 03068 <font class="keywordflow">return</font> FALSE; 03069 } 03070 03071 <font class="comment">/* Fill in filter after all memory allocated,</font> 03072 <font class="comment"> * so we don't run the free_user_data_function</font> 03073 <font class="comment"> * if the add_filter() fails</font> 03074 <font class="comment"> */</font> 03075 03076 filter-><a class="code" href="structDBusMessageFilter.html#m1">function</a> = function; 03077 filter-><a class="code" href="structDBusMessageFilter.html#m2">user_data</a> = user_data; 03078 filter-><a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a> = free_data_function; 03079 03080 CONNECTION_UNLOCK (connection); 03081 <font class="keywordflow">return</font> TRUE; 03082 } 03083 03096 <font class="keywordtype">void</font> <a name="l03097"></a><a class="code" href="group__DBusConnection.html#a43">03097</a> dbus_connection_remove_filter (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03098 DBusHandleMessageFunction function, 03099 <font class="keywordtype">void</font> *user_data) 03100 { 03101 <a class="code" href="structDBusList.html">DBusList</a> *link; 03102 DBusMessageFilter *filter; 03103 03104 _dbus_return_if_fail (connection != NULL); 03105 _dbus_return_if_fail (function != NULL); 03106 03107 CONNECTION_LOCK (connection); 03108 03109 filter = NULL; 03110 03111 link = _dbus_list_get_last_link (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>); 03112 <font class="keywordflow">while</font> (link != NULL) 03113 { 03114 filter = link-><a class="code" href="structDBusList.html#m2">data</a>; 03115 03116 <font class="keywordflow">if</font> (filter-><a class="code" href="structDBusMessageFilter.html#m1">function</a> == function && 03117 filter-><a class="code" href="structDBusMessageFilter.html#m2">user_data</a> == user_data) 03118 { 03119 _dbus_list_remove_link (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>, link); 03120 filter-><a class="code" href="structDBusMessageFilter.html#m1">function</a> = NULL; 03121 03122 <font class="keywordflow">break</font>; 03123 } 03124 03125 link = _dbus_list_get_prev_link (&connection-><a class="code" href="structDBusConnection.html#m16">filter_list</a>, link); 03126 } 03127 03128 CONNECTION_UNLOCK (connection); 03129 03130 <font class="preprocessor">#ifndef DBUS_DISABLE_CHECKS</font> 03131 <font class="preprocessor"></font> <font class="keywordflow">if</font> (filter == NULL) 03132 { 03133 _dbus_warn (<font class="stringliteral">"Attempt to remove filter function %p user data %p, but no such filter has been added\n"</font>, 03134 function, user_data); 03135 <font class="keywordflow">return</font>; 03136 } 03137 <font class="preprocessor">#endif</font> 03138 <font class="preprocessor"></font> 03139 <font class="comment">/* Call application code */</font> 03140 <font class="keywordflow">if</font> (filter-><a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>) 03141 (* filter-><a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>) (filter-><a class="code" href="structDBusMessageFilter.html#m2">user_data</a>); 03142 03143 filter-><a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a> = NULL; 03144 filter-><a class="code" href="structDBusMessageFilter.html#m2">user_data</a> = NULL; 03145 03146 _dbus_message_filter_unref (filter); 03147 } 03148 03160 dbus_bool_t <a name="l03161"></a><a class="code" href="group__DBusConnection.html#a44">03161</a> dbus_connection_register_object_path (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03162 <font class="keyword">const</font> <font class="keywordtype">char</font> *path, 03163 <font class="keyword">const</font> <a class="code" href="structDBusObjectPathVTable.html">DBusObjectPathVTable</a> *vtable, 03164 <font class="keywordtype">void</font> *user_data) 03165 { 03166 <font class="keywordtype">char</font> **decomposed_path; 03167 dbus_bool_t retval; 03168 03169 _dbus_return_val_if_fail (connection != NULL, FALSE); 03170 _dbus_return_val_if_fail (path != NULL, FALSE); 03171 _dbus_return_val_if_fail (path[0] == <font class="charliteral">'/'</font>, FALSE); 03172 _dbus_return_val_if_fail (vtable != NULL, FALSE); 03173 03174 <font class="keywordflow">if</font> (!_dbus_decompose_path (path, strlen (path), &decomposed_path, NULL)) 03175 <font class="keywordflow">return</font> FALSE; 03176 03177 CONNECTION_LOCK (connection); 03178 03179 retval = _dbus_object_tree_register (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>, 03180 FALSE, 03181 (<font class="keyword">const</font> <font class="keywordtype">char</font> **) decomposed_path, vtable, 03182 user_data); 03183 03184 CONNECTION_UNLOCK (connection); 03185 03186 dbus_free_string_array (decomposed_path); 03187 03188 <font class="keywordflow">return</font> retval; 03189 } 03190 03203 dbus_bool_t <a name="l03204"></a><a class="code" href="group__DBusConnection.html#a45">03204</a> dbus_connection_register_fallback (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03205 <font class="keyword">const</font> <font class="keywordtype">char</font> *path, 03206 <font class="keyword">const</font> <a class="code" href="structDBusObjectPathVTable.html">DBusObjectPathVTable</a> *vtable, 03207 <font class="keywordtype">void</font> *user_data) 03208 { 03209 <font class="keywordtype">char</font> **decomposed_path; 03210 dbus_bool_t retval; 03211 03212 _dbus_return_val_if_fail (connection != NULL, FALSE); 03213 _dbus_return_val_if_fail (path != NULL, FALSE); 03214 _dbus_return_val_if_fail (path[0] == <font class="charliteral">'/'</font>, FALSE); 03215 _dbus_return_val_if_fail (vtable != NULL, FALSE); 03216 03217 <font class="keywordflow">if</font> (!_dbus_decompose_path (path, strlen (path), &decomposed_path, NULL)) 03218 <font class="keywordflow">return</font> FALSE; 03219 03220 CONNECTION_LOCK (connection); 03221 03222 retval = _dbus_object_tree_register (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>, 03223 TRUE, 03224 (<font class="keyword">const</font> <font class="keywordtype">char</font> **) decomposed_path, vtable, 03225 user_data); 03226 03227 CONNECTION_UNLOCK (connection); 03228 03229 dbus_free_string_array (decomposed_path); 03230 03231 <font class="keywordflow">return</font> retval; 03232 } 03233 03243 dbus_bool_t <a name="l03244"></a><a class="code" href="group__DBusConnection.html#a46">03244</a> dbus_connection_unregister_object_path (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03245 <font class="keyword">const</font> <font class="keywordtype">char</font> *path) 03246 { 03247 <font class="keywordtype">char</font> **decomposed_path; 03248 03249 _dbus_return_val_if_fail (connection != NULL, FALSE); 03250 _dbus_return_val_if_fail (path != NULL, FALSE); 03251 _dbus_return_val_if_fail (path[0] == <font class="charliteral">'/'</font>, FALSE); 03252 03253 <font class="keywordflow">if</font> (!_dbus_decompose_path (path, strlen (path), &decomposed_path, NULL)) 03254 <font class="keywordflow">return</font> FALSE; 03255 03256 CONNECTION_LOCK (connection); 03257 03258 _dbus_object_tree_unregister_and_unlock (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>, (<font class="keyword">const</font> <font class="keywordtype">char</font> **) decomposed_path); 03259 03260 dbus_free_string_array (decomposed_path); 03261 03262 <font class="keywordflow">return</font> TRUE; 03263 } 03264 03275 dbus_bool_t <a name="l03276"></a><a class="code" href="group__DBusConnection.html#a47">03276</a> dbus_connection_list_registered (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03277 <font class="keyword">const</font> <font class="keywordtype">char</font> *parent_path, 03278 <font class="keywordtype">char</font> ***child_entries) 03279 { 03280 <font class="keywordtype">char</font> **decomposed_path; 03281 dbus_bool_t retval; 03282 _dbus_return_val_if_fail (connection != NULL, FALSE); 03283 _dbus_return_val_if_fail (parent_path != NULL, FALSE); 03284 _dbus_return_val_if_fail (parent_path[0] == <font class="charliteral">'/'</font>, FALSE); 03285 _dbus_return_val_if_fail (child_entries != NULL, FALSE); 03286 03287 <font class="keywordflow">if</font> (!_dbus_decompose_path (parent_path, strlen (parent_path), &decomposed_path, NULL)) 03288 <font class="keywordflow">return</font> FALSE; 03289 03290 CONNECTION_LOCK (connection); 03291 03292 retval = _dbus_object_tree_list_registered_and_unlock (connection-><a class="code" href="structDBusConnection.html#m29">objects</a>, 03293 (<font class="keyword">const</font> <font class="keywordtype">char</font> **) decomposed_path, 03294 child_entries); 03295 dbus_free_string_array (decomposed_path); 03296 03297 <font class="keywordflow">return</font> retval; 03298 } 03299 03300 <font class="keyword">static</font> <a class="code" href="structDBusDataSlotAllocator.html">DBusDataSlotAllocator</a> slot_allocator; 03301 _DBUS_DEFINE_GLOBAL_LOCK (connection_slots); 03302 03317 dbus_bool_t <a name="l03318"></a><a class="code" href="group__DBusConnection.html#a48">03318</a> dbus_connection_allocate_data_slot (dbus_int32_t *slot_p) 03319 { 03320 <font class="keywordflow">return</font> _dbus_data_slot_allocator_alloc (&slot_allocator, 03321 _DBUS_LOCK_NAME (connection_slots), 03322 slot_p); 03323 } 03324 03336 <font class="keywordtype">void</font> <a name="l03337"></a><a class="code" href="group__DBusConnection.html#a49">03337</a> dbus_connection_free_data_slot (dbus_int32_t *slot_p) 03338 { 03339 _dbus_return_if_fail (*slot_p >= 0); 03340 03341 _dbus_data_slot_allocator_free (&slot_allocator, slot_p); 03342 } 03343 03357 dbus_bool_t <a name="l03358"></a><a class="code" href="group__DBusConnection.html#a50">03358</a> dbus_connection_set_data (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03359 dbus_int32_t slot, 03360 <font class="keywordtype">void</font> *data, 03361 DBusFreeFunction free_data_func) 03362 { 03363 DBusFreeFunction old_free_func; 03364 <font class="keywordtype">void</font> *old_data; 03365 dbus_bool_t retval; 03366 03367 _dbus_return_val_if_fail (connection != NULL, FALSE); 03368 _dbus_return_val_if_fail (slot >= 0, FALSE); 03369 03370 CONNECTION_LOCK (connection); 03371 03372 retval = _dbus_data_slot_list_set (&slot_allocator, 03373 &connection-><a class="code" href="structDBusConnection.html#m17">slot_list</a>, 03374 slot, data, free_data_func, 03375 &old_free_func, &old_data); 03376 03377 CONNECTION_UNLOCK (connection); 03378 03379 <font class="keywordflow">if</font> (retval) 03380 { 03381 <font class="comment">/* Do the actual free outside the connection lock */</font> 03382 <font class="keywordflow">if</font> (old_free_func) 03383 (* old_free_func) (old_data); 03384 } 03385 03386 <font class="keywordflow">return</font> retval; 03387 } 03388 03397 <font class="keywordtype">void</font>* <a name="l03398"></a><a class="code" href="group__DBusConnection.html#a51">03398</a> dbus_connection_get_data (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03399 dbus_int32_t slot) 03400 { 03401 <font class="keywordtype">void</font> *res; 03402 03403 _dbus_return_val_if_fail (connection != NULL, NULL); 03404 03405 CONNECTION_LOCK (connection); 03406 03407 res = _dbus_data_slot_list_get (&slot_allocator, 03408 &connection-><a class="code" href="structDBusConnection.html#m17">slot_list</a>, 03409 slot); 03410 03411 CONNECTION_UNLOCK (connection); 03412 03413 <font class="keywordflow">return</font> res; 03414 } 03415 03422 <font class="keywordtype">void</font> <a name="l03423"></a><a class="code" href="group__DBusConnection.html#a52">03423</a> dbus_connection_set_change_sigpipe (dbus_bool_t will_modify_sigpipe) 03424 { 03425 _dbus_modify_sigpipe = will_modify_sigpipe != FALSE; 03426 } 03427 03436 <font class="keywordtype">void</font> <a name="l03437"></a><a class="code" href="group__DBusConnection.html#a53">03437</a> dbus_connection_set_max_message_size (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03438 <font class="keywordtype">long</font> size) 03439 { 03440 _dbus_return_if_fail (connection != NULL); 03441 03442 CONNECTION_LOCK (connection); 03443 _dbus_transport_set_max_message_size (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 03444 size); 03445 CONNECTION_UNLOCK (connection); 03446 } 03447 03454 <font class="keywordtype">long</font> <a name="l03455"></a><a class="code" href="group__DBusConnection.html#a54">03455</a> dbus_connection_get_max_message_size (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 03456 { 03457 <font class="keywordtype">long</font> res; 03458 03459 _dbus_return_val_if_fail (connection != NULL, 0); 03460 03461 CONNECTION_LOCK (connection); 03462 res = _dbus_transport_get_max_message_size (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 03463 CONNECTION_UNLOCK (connection); 03464 <font class="keywordflow">return</font> res; 03465 } 03466 03492 <font class="keywordtype">void</font> <a name="l03493"></a><a class="code" href="group__DBusConnection.html#a55">03493</a> dbus_connection_set_max_received_size (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection, 03494 <font class="keywordtype">long</font> size) 03495 { 03496 _dbus_return_if_fail (connection != NULL); 03497 03498 CONNECTION_LOCK (connection); 03499 _dbus_transport_set_max_received_size (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>, 03500 size); 03501 CONNECTION_UNLOCK (connection); 03502 } 03503 03510 <font class="keywordtype">long</font> <a name="l03511"></a><a class="code" href="group__DBusConnection.html#a56">03511</a> dbus_connection_get_max_received_size (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 03512 { 03513 <font class="keywordtype">long</font> res; 03514 03515 _dbus_return_val_if_fail (connection != NULL, 0); 03516 03517 CONNECTION_LOCK (connection); 03518 res = _dbus_transport_get_max_received_size (connection-><a class="code" href="structDBusConnection.html#m13">transport</a>); 03519 CONNECTION_UNLOCK (connection); 03520 <font class="keywordflow">return</font> res; 03521 } 03522 03533 <font class="keywordtype">long</font> <a name="l03534"></a><a class="code" href="group__DBusConnection.html#a57">03534</a> dbus_connection_get_outgoing_size (<a class="code" href="structDBusConnection.html">DBusConnection</a> *connection) 03535 { 03536 <font class="keywordtype">long</font> res; 03537 03538 _dbus_return_val_if_fail (connection != NULL, 0); 03539 03540 CONNECTION_LOCK (connection); 03541 res = _dbus_counter_get_value (connection-><a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>); 03542 CONNECTION_UNLOCK (connection); 03543 <font class="keywordflow">return</font> res; 03544 } 03545 </pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:25 2004 for D-BUS by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.15 </small></address> </body> </html>