Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>dbus-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> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>dbus-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 &lt;config.h&gt;</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)-&gt;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)-&gt;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)-&gt;mutex)</font>
00053 <font class="preprocessor"></font><font class="preprocessor">#define CONNECTION_UNLOCK(connection)  dbus_mutex_unlock ((connection)-&gt;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-&gt;<a class="code" href="structDBusMessageFilter.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> &gt; 0);
00227   _dbus_atomic_inc (&amp;filter-&gt;<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-&gt;<a class="code" href="structDBusMessageFilter.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> &gt; 0);
00236 
00237   <font class="keywordflow">if</font> (_dbus_atomic_dec (&amp;filter-&gt;<a class="code" href="structDBusMessageFilter.html#m0">refcount</a>) == 1)
00238     {
00239       <font class="keywordflow">if</font> (filter-&gt;<a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>)
00240         (* filter-&gt;<a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>) (filter-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a>)
00279     (*connection-&gt;<a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a>) (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>));
00327   
00328   _dbus_list_append_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>,
00329                           link);
00330   message = link-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusPendingCall.html#m9">timeout_added</a>)
00341             _dbus_connection_remove_timeout_locked (connection,
00342                                                     pending-&gt;<a class="code" href="structDBusPendingCall.html#m5">timeout</a>);
00343 
00344           pending-&gt;<a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = FALSE;
00345         }
00346     }
00347   
00348   connection-&gt;<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-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, link);
00378 
00379   connection-&gt;<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-&gt;<a class="code" href="structDBusList.html#m2">data</a>, connection, connection-&gt;<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-&gt;<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 (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>));
00428   
00429   link = _dbus_list_get_last_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>);
00430   _dbus_assert (link != NULL);
00431   _dbus_assert (link-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>,
00435                      link);
00436   _dbus_list_prepend_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m28">link_cache</a>, link);
00437   
00438   connection-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>,
00451                                      &amp;link);
00452   _dbus_list_prepend_link (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m10">n_outgoing</a> == 0)
00457     _dbus_transport_messages_pending (connection-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>,
00458                                       connection-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m14">watches</a>) <font class="comment">/* null during finalize */</font>
00495     _dbus_watch_list_remove_watch (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m14">watches</a>) <font class="comment">/* null during finalize */</font>
00514     _dbus_watch_list_toggle_watch (connection-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m15">timeouts</a>) <font class="comment">/* null during finalize */</font>
00553     _dbus_timeout_list_remove_timeout (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m15">timeouts</a>) <font class="comment">/* null during finalize */</font>
00581     _dbus_timeout_list_toggle_timeout (connection-&gt;<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-&gt;<a class="code" href="structDBusPendingCall.html#m7">reply_serial</a> != 0);
00590 
00591   <font class="keywordflow">if</font> (!_dbus_connection_add_timeout (connection, pending-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m18">pending_replies</a>,
00595                                     pending-&gt;<a class="code" href="structDBusPendingCall.html#m7">reply_serial</a>,
00596                                     pending))
00597     {
00598       _dbus_connection_remove_timeout (connection, pending-&gt;<a class="code" href="structDBusPendingCall.html#m5">timeout</a>);
00599       <font class="keywordflow">return</font> FALSE;
00600     }
00601   
00602   pending-&gt;<a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = TRUE;
00603   pending-&gt;<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-&gt;<a class="code" href="structDBusPendingCall.html#m3">connection</a>)
00621     {
00622       <font class="keywordflow">if</font> (pending-&gt;<a class="code" href="structDBusPendingCall.html#m9">timeout_added</a>)
00623         {
00624           _dbus_connection_remove_timeout (pending-&gt;<a class="code" href="structDBusPendingCall.html#m3">connection</a>,
00625                                            pending-&gt;<a class="code" href="structDBusPendingCall.html#m5">timeout</a>);
00626           pending-&gt;<a class="code" href="structDBusPendingCall.html#m9">timeout_added</a> = FALSE;
00627         }
00628 
00629       pending-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m18">pending_replies</a>,
00645                                pending-&gt;<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-&gt;<a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
00681       _dbus_list_clear (&amp;pending-&gt;<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-&gt;<a class="code" href="structDBusPendingCall.html#m7">reply_serial</a>);
00693   
00694   _dbus_assert (pending-&gt;<a class="code" href="structDBusPendingCall.html#m4">reply</a> == NULL);
00695   _dbus_assert (pending-&gt;<a class="code" href="structDBusPendingCall.html#m7">reply_serial</a> == dbus_message_get_reply_serial (message));
00696   pending-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m5">io_path_cond</a>,
00725                                          connection-&gt;<a class="code" href="structDBusConnection.html#m1">mutex</a>,
00726                                          timeout_milliseconds);
00727       <font class="keywordflow">else</font>
00728         dbus_condvar_wait (connection-&gt;<a class="code" href="structDBusConnection.html#m5">io_path_cond</a>, connection-&gt;<a class="code" href="structDBusConnection.html#m1">mutex</a>);
00729     }
00730   
00731   <font class="keywordflow">if</font> (res)
00732     {
00733       _dbus_assert (!connection-&gt;<a class="code" href="structDBusConnection.html#m4">io_path_acquired</a>);
00734 
00735       connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m4">io_path_acquired</a>);
00752 
00753   connection-&gt;<a class="code" href="structDBusConnection.html#m4">io_path_acquired</a> = FALSE;
00754   dbus_condvar_wake_one (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m10">n_outgoing</a> == 0)
00790     flags &amp;= ~DBUS_ITERATION_DO_WRITING;
00791 
00792   <font class="keywordflow">if</font> (_dbus_connection_acquire_io_path (connection,
00793                                         (flags &amp; DBUS_ITERATION_BLOCK) ? timeout_milliseconds : 0))
00794     {
00795       _dbus_transport_do_iteration (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1;
00897   connection-&gt;<a class="code" href="structDBusConnection.html#m1">mutex</a> = mutex;
00898   connection-&gt;<a class="code" href="structDBusConnection.html#m3">dispatch_cond</a> = dispatch_cond;
00899   connection-&gt;<a class="code" href="structDBusConnection.html#m5">io_path_cond</a> = io_path_cond;
00900   connection-&gt;<a class="code" href="structDBusConnection.html#m9">message_returned_cond</a> = message_returned_cond;
00901   connection-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a> = transport;
00902   connection-&gt;<a class="code" href="structDBusConnection.html#m14">watches</a> = watch_list;
00903   connection-&gt;<a class="code" href="structDBusConnection.html#m15">timeouts</a> = timeout_list;
00904   connection-&gt;<a class="code" href="structDBusConnection.html#m18">pending_replies</a> = pending_replies;
00905   connection-&gt;<a class="code" href="structDBusConnection.html#m12">outgoing_counter</a> = outgoing_counter;
00906   connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a> = NULL;
00907   connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m29">objects</a> = objects;
00909   connection-&gt;<a class="code" href="structDBusConnection.html#m30">exit_on_disconnect</a> = FALSE;
00910   
00911   _dbus_data_slot_list_init (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m17">slot_list</a>);
00912 
00913   connection-&gt;<a class="code" href="structDBusConnection.html#m19">client_serial</a> = 1;
00914 
00915   connection-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>);
00976 <font class="preprocessor">#else</font>
00977 <font class="preprocessor"></font>  _dbus_assert (connection-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> &gt; 0);
00978   connection-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>) == 1);
01003 <font class="preprocessor">#else  </font>
01004 <font class="preprocessor"></font>  _dbus_assert (connection-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> &gt; 0);
01005 
01006   connection-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> -= 1;
01007   last_unref = (connection-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m19">client_serial</a>++;
01023 
01024   <font class="keywordflow">if</font> (connection-&gt;<a class="code" href="structDBusConnection.html#m19">client_serial</a> &lt; 0)
01025     connection-&gt;<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-&gt;<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 (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> &gt; 0);
01142 
01143   connection-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m14">watches</a>);
01189   connection-&gt;<a class="code" href="structDBusConnection.html#m14">watches</a> = NULL;
01190   
01191   _dbus_timeout_list_free (connection-&gt;<a class="code" href="structDBusConnection.html#m15">timeouts</a>);
01192   connection-&gt;<a class="code" href="structDBusConnection.html#m15">timeouts</a> = NULL;
01193 
01194   _dbus_data_slot_list_free (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m17">slot_list</a>);
01195   
01196   link = _dbus_list_get_first_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a>);
01197   <font class="keywordflow">while</font> (link != NULL)
01198     {
01199       DBusMessageFilter *filter = link-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
01200       <a class="code" href="structDBusList.html">DBusList</a> *next = _dbus_list_get_next_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a>, link);
01201 
01202       filter-&gt;<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-&gt;<a class="code" href="structDBusList.html#m2">data</a> = NULL;
01205       
01206       link = next;
01207     }
01208   _dbus_list_clear (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m29">objects</a>);  
01213 
01214   _dbus_hash_table_unref (connection-&gt;<a class="code" href="structDBusConnection.html#m18">pending_replies</a>);
01215   connection-&gt;<a class="code" href="structDBusConnection.html#m18">pending_replies</a> = NULL;
01216   
01217   _dbus_list_clear (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a>);
01218   
01219   _dbus_list_foreach (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>,
01220                       free_outgoing_message,
01221                       connection);
01222   _dbus_list_clear (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>);
01223   
01224   _dbus_list_foreach (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>,
01225                       (DBusForeachFunction) dbus_message_unref,
01226                       NULL);
01227   _dbus_list_clear (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>);
01228 
01229   _dbus_counter_unref (connection-&gt;<a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>);
01230   
01231   _dbus_transport_unref (connection-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>);
01232 
01233   <font class="keywordflow">if</font> (connection-&gt;<a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>)
01234     {
01235       <a class="code" href="structDBusMessage.html">DBusMessage</a> *message = connection-&gt;<a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
01236       dbus_message_unref (message);
01237       _dbus_list_free_link (connection-&gt;<a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>);
01238     }
01239 
01240   _dbus_list_clear (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m28">link_cache</a>);
01241   
01242   dbus_condvar_free (connection-&gt;<a class="code" href="structDBusConnection.html#m3">dispatch_cond</a>);
01243   dbus_condvar_free (connection-&gt;<a class="code" href="structDBusConnection.html#m5">io_path_cond</a>);
01244   dbus_condvar_free (connection-&gt;<a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>);  
01245   
01246   dbus_mutex_free (connection-&gt;<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 (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> &gt; 0);
01279 
01280   connection-&gt;<a class="code" href="structDBusConnection.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> -= 1;
01281   last_unref = (connection-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m28">link_cache</a> != NULL)
01411     {
01412       preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a> =
01413         _dbus_list_pop_first_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m28">link_cache</a>);
01414       preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a> = NULL;
01415     }
01416   <font class="keywordflow">else</font>
01417     {
01418       preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a> = _dbus_list_alloc_link (NULL);
01419       <font class="keywordflow">if</font> (preallocated-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m28">link_cache</a> != NULL)
01424     {
01425       preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a> =
01426         _dbus_list_pop_first_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m28">link_cache</a>);
01427       preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a> = connection-&gt;<a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>;
01428     }
01429   <font class="keywordflow">else</font>
01430     {
01431       preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a> = _dbus_list_alloc_link (connection-&gt;<a class="code" href="structDBusConnection.html#m12">outgoing_counter</a>);
01432       <font class="keywordflow">if</font> (preallocated-&gt;<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-&gt;<a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
01437 
01438   preallocated-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusPreallocatedSend.html#m0">connection</a>);
01492 
01493   _dbus_list_free_link (preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>);
01494   _dbus_counter_unref (preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m2">counter_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
01495   _dbus_list_free_link (preallocated-&gt;<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-&gt;<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>-&gt;<a class="code" href="structDBusList.html#m2">data</a> = message;
01508   _dbus_list_prepend_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m6">outgoing_messages</a>,
01509                            preallocated-&gt;<a class="code" href="structDBusPreallocatedSend.html#m1">queue_link</a>);
01510 
01511   _dbus_message_add_size_counter_link (message,
01512                                        preallocated-&gt;<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-&gt;<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-&gt;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-&gt;<a class="code" href="structDBusConnection.html#m10">n_outgoing</a> == 1)
01547     _dbus_transport_messages_pending (connection-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>,
01548                                       connection-&gt;<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-&gt;<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 &amp;&amp;
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 &amp;&amp;
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-&gt;<a class="code" href="structDBusPendingCall.html#m3">connection</a>;
01657   
01658   CONNECTION_LOCK (connection);
01659   <font class="keywordflow">if</font> (pending-&gt;<a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>)
01660     {
01661       _dbus_connection_queue_synthesized_message_link (connection,
01662                                                        pending-&gt;<a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>);
01663       pending-&gt;<a class="code" href="structDBusPendingCall.html#m6">timeout_link</a> = NULL;
01664     }
01665 
01666   _dbus_connection_remove_timeout (connection,
01667                                    pending-&gt;<a class="code" href="structDBusPendingCall.html#m5">timeout</a>);
01668   pending-&gt;<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 &gt;= 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-&gt;<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-&gt;<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 (&amp;connection-&gt;<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-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>, link);
01812           connection-&gt;<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 (&amp;connection-&gt;<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 &gt;= 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 &gt; _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 (&amp;start_tv_sec, &amp;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 (&amp;tv_sec, &amp;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 &lt; 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-&gt;<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 &lt; end_tv_sec ||
01921            (tv_sec == end_tv_sec &amp;&amp; tv_usec &lt; 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 &gt;= 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 &lt; 100)
01937             ; <font class="comment">/* just busy loop */</font>
01938           <font class="keywordflow">else</font> <font class="keywordflow">if</font> (timeout_milliseconds &lt;= 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 &gt;= 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, &amp;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-&gt;<a class="code" href="structDBusConnection.html#m10">n_outgoing</a> &gt; 0 &amp;&amp;
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-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a> != NULL);
02067 
02068   <font class="keywordflow">while</font> (connection-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a> != NULL)
02069     dbus_condvar_wait (connection-&gt;<a class="code" href="structDBusConnection.html#m9">message_returned_cond</a>, connection-&gt;<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-&gt;<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-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>);
02109 
02110   <font class="keywordflow">if</font> (message) 
02111     connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>);
02132   
02133   CONNECTION_LOCK (connection);
02134   
02135   _dbus_assert (message == connection-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a>);
02136   
02137   connection-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a> = NULL;
02138   dbus_condvar_wake_all (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>);
02162   
02163   CONNECTION_LOCK (connection);
02164  
02165   _dbus_assert (message == connection-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a>);
02166 
02167   pop_message = _dbus_list_pop_first (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>);
02168   _dbus_assert (message == pop_message);
02169   
02170   connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m11">n_incoming</a>);
02174  
02175   connection-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a> = NULL;
02176   dbus_condvar_wake_all (connection-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m11">n_incoming</a> &gt; 0)
02191     {
02192       <a class="code" href="structDBusList.html">DBusList</a> *link;
02193 
02194       link = _dbus_list_pop_first_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>);
02195       connection-&gt;<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-&gt;<a class="code" href="structDBusList.html#m2">data</a>,
02199                      dbus_message_get_type (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>),
02200                      dbus_message_get_interface (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>) ?
02201                      dbus_message_get_interface (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>) :
02202                      "no interface",
02203                      dbus_message_get_signature (link-&gt;data),
02204                      connection, connection-&gt;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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m8">message_borrowed</a> == NULL);
02243 
02244   _dbus_list_prepend_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>,
02245                            message_link);
02246   connection-&gt;<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-&gt;<a class="code" href="structDBusList.html#m2">data</a>,
02250                  dbus_message_get_type (message_link-&gt;<a class="code" href="structDBusList.html#m2">data</a>),
02251                  dbus_message_get_interface (message_link-&gt;<a class="code" href="structDBusList.html#m2">data</a>) ?
02252                  dbus_message_get_interface (message_link-&gt;<a class="code" href="structDBusList.html#m2">data</a>) :
02253                  "no interface",
02254                  dbus_message_get_signature (message_link-&gt;data),
02255                  connection, connection-&gt;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-&gt;<a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>)
02308     dbus_condvar_wait (connection-&gt;<a class="code" href="structDBusConnection.html#m3">dispatch_cond</a>, connection-&gt;<a class="code" href="structDBusConnection.html#m1">mutex</a>);
02309   _dbus_assert (!connection-&gt;<a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>);
02310 
02311   connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a>);
02325 
02326   connection-&gt;<a class="code" href="structDBusConnection.html#m2">dispatch_acquired</a> = FALSE;
02327   dbus_condvar_wake_one (connection-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m7">incoming_messages</a>,
02335                            message_link);
02336   connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m11">n_incoming</a> &gt; 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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>);
02351 
02352       <font class="keywordflow">if</font> (status == DBUS_DISPATCH_COMPLETE &amp;&amp;
02353           connection-&gt;<a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a> &amp;&amp;
02354           !_dbus_transport_get_is_connected (connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m20">disconnect_message_link</a>);
02361           connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m11">n_incoming</a> &gt; 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-&gt;<a class="code" href="structDBusConnection.html#m27">last_dispatch_status</a>;
02386 
02387   connection-&gt;<a class="code" href="structDBusConnection.html#m27">last_dispatch_status</a> = new_status;
02388 
02389   function = connection-&gt;<a class="code" href="structDBusConnection.html#m24">dispatch_status_function</a>;
02390   data = connection-&gt;<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 &amp;&amp; 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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m18">pending_replies</a>,
02516                                          reply_serial);
02517   
02518   <font class="keywordflow">if</font> (!_dbus_list_copy (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a>, &amp;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 (&amp;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 (&amp;filter_list_copy);
02543   <font class="keywordflow">while</font> (link != NULL)
02544     {
02545       DBusMessageFilter *filter = link-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
02546       <a class="code" href="structDBusList.html">DBusList</a> *next = _dbus_list_get_next_link (&amp;filter_list_copy, link);
02547 
02548       _dbus_verbose (<font class="stringliteral">"  running filter on message %p\n"</font>, message);
02549       result = (* filter-&gt;<a class="code" href="structDBusMessageFilter.html#m1">function</a>) (connection, message, filter-&gt;<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 (&amp;filter_list_copy,
02558                       (DBusForeachFunction)_dbus_message_filter_unref,
02559                       NULL);
02560   _dbus_list_clear (&amp;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 &amp;&amp; result == DBUS_HANDLER_RESULT_HANDLED)
02569     {
02570       <font class="comment">/* Queue the timeout immediately! */</font>
02571       <font class="keywordflow">if</font> (pending-&gt;<a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>)
02572         {
02573           _dbus_connection_queue_synthesized_message_link (connection,
02574                                                            pending-&gt;<a class="code" href="structDBusPendingCall.html#m6">timeout_link</a>);
02575           pending-&gt;<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-&gt;<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 (&amp;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 (&amp;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 (&amp;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 (&amp;str));
02644       _dbus_string_free (&amp;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-&gt;<a class="code" href="structDBusConnection.html#m30">exit_on_disconnect</a> &amp;&amp;
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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m22">wakeup_main_data</a>;
02899   old_free_data = connection-&gt;<a class="code" href="structDBusConnection.html#m23">free_wakeup_main_data</a>;
02900 
02901   connection-&gt;<a class="code" href="structDBusConnection.html#m21">wakeup_main_function</a> = wakeup_main_function;
02902   connection-&gt;<a class="code" href="structDBusConnection.html#m22">wakeup_main_data</a> = data;
02903   connection-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m25">dispatch_status_data</a>;
02941   old_free_data = connection-&gt;<a class="code" href="structDBusConnection.html#m26">free_dispatch_status_data</a>;
02942 
02943   connection-&gt;<a class="code" href="structDBusConnection.html#m24">dispatch_status_function</a> = function;
02944   connection-&gt;<a class="code" href="structDBusConnection.html#m25">dispatch_status_data</a> = data;
02945   connection-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusConnection.html#m13">transport</a>,
03015                                           function, data, free_data_function,
03016                                           &amp;old_data, &amp;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-&gt;<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 (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusMessageFilter.html#m1">function</a> = function;
03077   filter-&gt;<a class="code" href="structDBusMessageFilter.html#m2">user_data</a> = user_data;
03078   filter-&gt;<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 (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a>);
03112   <font class="keywordflow">while</font> (link != NULL)
03113     {
03114       filter = link-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
03115 
03116       <font class="keywordflow">if</font> (filter-&gt;<a class="code" href="structDBusMessageFilter.html#m1">function</a> == function &amp;&amp;
03117           filter-&gt;<a class="code" href="structDBusMessageFilter.html#m2">user_data</a> == user_data)
03118         {
03119           _dbus_list_remove_link (&amp;connection-&gt;<a class="code" href="structDBusConnection.html#m16">filter_list</a>, link);
03120           filter-&gt;<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 (&amp;connection-&gt;<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-&gt;<a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>)
03141     (* filter-&gt;<a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a>) (filter-&gt;<a class="code" href="structDBusMessageFilter.html#m2">user_data</a>);
03142 
03143   filter-&gt;<a class="code" href="structDBusMessageFilter.html#m3">free_user_data_function</a> = NULL;
03144   filter-&gt;<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), &amp;decomposed_path, NULL))
03175     <font class="keywordflow">return</font> FALSE;
03176 
03177   CONNECTION_LOCK (connection);
03178 
03179   retval = _dbus_object_tree_register (connection-&gt;<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), &amp;decomposed_path, NULL))
03218     <font class="keywordflow">return</font> FALSE;
03219 
03220   CONNECTION_LOCK (connection);
03221 
03222   retval = _dbus_object_tree_register (connection-&gt;<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), &amp;decomposed_path, NULL))
03254       <font class="keywordflow">return</font> FALSE;
03255 
03256   CONNECTION_LOCK (connection);
03257 
03258   _dbus_object_tree_unregister_and_unlock (connection-&gt;<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), &amp;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-&gt;<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 (&amp;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 &gt;= 0);
03340   
03341   _dbus_data_slot_allocator_free (&amp;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 &gt;= 0, FALSE);
03369   
03370   CONNECTION_LOCK (connection);
03371 
03372   retval = _dbus_data_slot_list_set (&amp;slot_allocator,
03373                                      &amp;connection-&gt;<a class="code" href="structDBusConnection.html#m17">slot_list</a>,
03374                                      slot, data, free_data_func,
03375                                      &amp;old_free_func, &amp;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 (&amp;slot_allocator,
03408                                   &amp;connection-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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>