Sophie

Sophie

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

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-message-handler.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-message-handler.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font>
00002 <font class="comment">/* dbus-message-handler.c Sender/receiver of messages.</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 "dbus-internals.h"</font>
00025 <font class="preprocessor">#include "dbus-message-handler.h"</font>
00026 <font class="preprocessor">#include "dbus-list.h"</font>
00027 <font class="preprocessor">#include "dbus-threads.h"</font>
00028 <font class="preprocessor">#include "dbus-test.h"</font>
00029 <font class="preprocessor">#include "dbus-connection-internal.h"</font>
00030 
00041 _DBUS_DEFINE_GLOBAL_LOCK (message_handler);
00042 
<a name="l00048"></a><a class="code" href="structDBusMessageHandler.html">00048</a> <font class="keyword">struct </font><a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a>
00049 {
<a name="l00050"></a><a class="code" href="structDBusMessageHandler.html#m0">00050</a>   <a class="code" href="structDBusAtomic.html">DBusAtomic</a> <a class="code" href="structDBusMessageHandler.html#m0">refcount</a>;                            
<a name="l00052"></a><a class="code" href="structDBusMessageHandler.html#m1">00052</a>   DBusHandleMessageFunction <a class="code" href="structDBusMessageHandler.html#m1">function</a>;             
<a name="l00053"></a><a class="code" href="structDBusMessageHandler.html#m2">00053</a>   <font class="keywordtype">void</font>                     *<a class="code" href="structDBusMessageHandler.html#m2">user_data</a>;            
<a name="l00054"></a><a class="code" href="structDBusMessageHandler.html#m3">00054</a>   DBusFreeFunction          <a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>;       
<a name="l00056"></a><a class="code" href="structDBusMessageHandler.html#m4">00056</a>   <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusMessageHandler.html#m4">connections</a>;                          
00057 };
00058 
00068 dbus_bool_t
<a name="l00069"></a><a class="code" href="group__DBusMessageHandlerInternals.html#a0">00069</a> _dbus_message_handler_add_connection (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00070                                       <a class="code" href="structDBusConnection.html">DBusConnection</a>     *connection)
00071 {
00072   dbus_bool_t res;
00073   
00074   _DBUS_LOCK (message_handler);
00075   <font class="comment">/* This is a bit wasteful - we just put the connection in the list</font>
00076 <font class="comment">   * once per time it's added. :-/</font>
00077 <font class="comment">   */</font>
00078   <font class="keywordflow">if</font> (!_dbus_list_prepend (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m4">connections</a>, connection))
00079     res = FALSE;
00080   <font class="keywordflow">else</font>
00081     res = TRUE;
00082 
00083   _DBUS_UNLOCK (message_handler);
00084   
00085   <font class="keywordflow">return</font> res;
00086 }
00087 
00093 <font class="keywordtype">void</font>
<a name="l00094"></a><a class="code" href="group__DBusMessageHandlerInternals.html#a1">00094</a> _dbus_message_handler_remove_connection (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00095                                          <a class="code" href="structDBusConnection.html">DBusConnection</a>     *connection)
00096 {
00097   _DBUS_LOCK (message_handler);
00098   <font class="keywordflow">if</font> (!_dbus_list_remove (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m4">connections</a>, connection))
00099     _dbus_warn (<font class="stringliteral">"Function _dbus_message_handler_remove_connection() called when the connection hadn't been added\n"</font>);
00100   _DBUS_UNLOCK (message_handler);
00101 }
00102 
00103 
00114 DBusHandlerResult
<a name="l00115"></a><a class="code" href="group__DBusMessageHandlerInternals.html#a2">00115</a> _dbus_message_handler_handle_message (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a>        *handler,
00116                                       <a class="code" href="structDBusConnection.html">DBusConnection</a>            *connection,
00117                                       <a class="code" href="structDBusMessage.html">DBusMessage</a>               *message)
00118 {
00119   DBusHandleMessageFunction function;
00120   <font class="keywordtype">void</font>  *user_data;
00121   
00122   _DBUS_LOCK (message_handler);
00123   function = handler-&gt;<a class="code" href="structDBusMessageHandler.html#m1">function</a>;
00124   user_data = handler-&gt;<a class="code" href="structDBusMessageHandler.html#m2">user_data</a>;
00125   _DBUS_UNLOCK (message_handler);
00126   
00127   <font class="comment">/* This function doesn't ref handler/connection/message</font>
00128 <font class="comment">   * since that's done in dbus_connection_dispatch().</font>
00129 <font class="comment">   */</font>
00130   <font class="keywordflow">if</font> (function != NULL)
00131     <font class="keywordflow">return</font> (* function) (handler, connection, message, user_data);
00132   <font class="keywordflow">else</font>
00133     <font class="keywordflow">return</font> DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
00134 }
00135 
00167 <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a>*
<a name="l00168"></a><a class="code" href="group__DBusMessageHandler.html#a0">00168</a> dbus_message_handler_new (DBusHandleMessageFunction function,
00169                           <font class="keywordtype">void</font>                     *user_data,
00170                           DBusFreeFunction          free_user_data)
00171 {
00172   <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler;
00173 
00174   handler = dbus_new (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a>, 1);
00175 
00176   <font class="keywordflow">if</font> (handler == NULL)
00177     <font class="keywordflow">return</font> NULL;
00178   
00179   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1;
00180   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m1">function</a> = function;
00181   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m2">user_data</a> = user_data;
00182   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a> = free_user_data;
00183   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m4">connections</a> = NULL;
00184 
00185   <font class="keywordflow">return</font> handler;
00186 }
00187 
00194 <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *
<a name="l00195"></a><a class="code" href="group__DBusMessageHandler.html#a1">00195</a> dbus_message_handler_ref (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler)
00196 {
00197   _dbus_return_if_fail (handler != NULL);
00198 
00199   _dbus_atomic_inc (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m0">refcount</a>);
00200 
00201   <font class="keywordflow">return</font> handler;
00202 }
00203 
00210 <font class="keywordtype">void</font>
<a name="l00211"></a><a class="code" href="group__DBusMessageHandler.html#a2">00211</a> dbus_message_handler_unref (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler)
00212 {
00213   dbus_bool_t last_unref;
00214 
00215   _dbus_return_if_fail (handler != NULL);
00216 
00217   last_unref = (_dbus_atomic_dec (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m0">refcount</a>) == 1);
00218   
00219   <font class="keywordflow">if</font> (last_unref)
00220     {
00221       <a class="code" href="structDBusList.html">DBusList</a> *link;
00222       
00223       <font class="keywordflow">if</font> (handler-&gt;<a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>)
00224         (* handler-&gt;<a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>) (handler-&gt;<a class="code" href="structDBusMessageHandler.html#m2">user_data</a>);
00225        
00226       link = _dbus_list_get_first_link (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m4">connections</a>);
00227        <font class="keywordflow">while</font> (link != NULL)
00228          {
00229            <a class="code" href="structDBusConnection.html">DBusConnection</a> *connection = link-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
00230 
00231            _dbus_connection_handler_destroyed_locked (connection, handler);
00232            
00233            link = _dbus_list_get_next_link (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m4">connections</a>, link);
00234          }
00235 
00236        _dbus_list_clear (&amp;handler-&gt;<a class="code" href="structDBusMessageHandler.html#m4">connections</a>);
00237 
00238        dbus_free (handler);
00239     }
00240 }
00241 
00249 <font class="keywordtype">void</font>*
<a name="l00250"></a><a class="code" href="group__DBusMessageHandler.html#a3">00250</a> dbus_message_handler_get_data (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler)
00251 {
00252   <font class="keywordtype">void</font>* user_data;
00253 
00254   _dbus_return_val_if_fail (handler != NULL, NULL);
00255   
00256   _DBUS_LOCK (message_handler);
00257   user_data = handler-&gt;<a class="code" href="structDBusMessageHandler.html#m2">user_data</a>;
00258   _DBUS_UNLOCK (message_handler);
00259   <font class="keywordflow">return</font> user_data;
00260 }
00261 
00271 <font class="keywordtype">void</font>
<a name="l00272"></a><a class="code" href="group__DBusMessageHandler.html#a4">00272</a> dbus_message_handler_set_data (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00273                                <font class="keywordtype">void</font>               *user_data,
00274                                DBusFreeFunction    free_user_data)
00275 {
00276   DBusFreeFunction old_free_func;
00277   <font class="keywordtype">void</font> *old_user_data;
00278 
00279   _dbus_return_if_fail (handler != NULL);
00280   
00281   _DBUS_LOCK (message_handler);
00282   old_free_func = handler-&gt;<a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>;
00283   old_user_data = handler-&gt;<a class="code" href="structDBusMessageHandler.html#m2">user_data</a>;
00284 
00285   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m2">user_data</a> = user_data;
00286   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a> = free_user_data;
00287   _DBUS_UNLOCK (message_handler);
00288 
00289   <font class="keywordflow">if</font> (old_free_func)
00290     (* old_free_func) (old_user_data);
00291 
00292 }
00293 
00301 <font class="keywordtype">void</font>
<a name="l00302"></a><a class="code" href="group__DBusMessageHandler.html#a5">00302</a> dbus_message_handler_set_function (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a>        *handler,
00303                                    DBusHandleMessageFunction  function)
00304 {
00305   _dbus_return_if_fail (handler != NULL);
00306   
00307   _DBUS_LOCK (message_handler);
00308   handler-&gt;<a class="code" href="structDBusMessageHandler.html#m1">function</a> = function;
00309   _DBUS_UNLOCK (message_handler);
00310 }
00311 
00314 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font>
00315 <font class="preprocessor"></font><font class="keyword">static</font> DBusHandlerResult
00316 test_handler (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00317               <a class="code" href="structDBusConnection.html">DBusConnection</a>     *connection,
00318               <a class="code" href="structDBusMessage.html">DBusMessage</a>        *message,
00319               <font class="keywordtype">void</font>               *user_data)
00320 {
00321   <font class="keywordflow">return</font> DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
00322 }
00323 
00324 <font class="keyword">static</font> <font class="keywordtype">void</font>
00325 free_test_data (<font class="keywordtype">void</font> *data)
00326 {
00327   <font class="comment">/* does nothing */</font>
00328 }
00329 
00336 dbus_bool_t
<a name="l00337"></a><a class="code" href="group__DBusMessageInternals.html#a2">00337</a> _dbus_message_handler_test (<font class="keyword">const</font> <font class="keywordtype">char</font> *test_data_dir)
00338 {
00339   <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler;
00340 
00341 <font class="preprocessor">#define TEST_DATA ((void*) 0xcafebabe)</font>
00342 <font class="preprocessor"></font>  
00343   handler = dbus_message_handler_new (test_handler,
00344                                       TEST_DATA,
00345                                       free_test_data);
00346 
00347   _dbus_assert (handler != NULL);
00348   _dbus_assert (handler-&gt;<a class="code" href="structDBusMessageHandler.html#m1">function</a> == test_handler);
00349 
00350   <font class="keywordflow">if</font> (dbus_message_handler_get_data (handler) != TEST_DATA)
00351     _dbus_assert_not_reached (<font class="stringliteral">"got wrong data"</font>);
00352 
00353   dbus_message_handler_set_data (handler, NULL, NULL);
00354   <font class="keywordflow">if</font> (dbus_message_handler_get_data (handler) != NULL)
00355     _dbus_assert_not_reached (<font class="stringliteral">"got wrong data after set"</font>);  
00356   
00357   dbus_message_handler_set_function (handler, NULL);
00358   _dbus_assert (handler-&gt;<a class="code" href="structDBusMessageHandler.html#m1">function</a> == NULL);
00359 
00360   dbus_message_handler_ref (handler);
00361   dbus_message_handler_unref (handler);
00362   dbus_message_handler_unref (handler);
00363   
00364   <font class="keywordflow">return</font> TRUE;
00365 }
00366 <font class="preprocessor">#endif </font><font class="comment">/* DBUS_BUILD_TESTS */</font>
</pre></div><hr><address align="right"><small>Generated on Wed Jun 2 06:01:33 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>