<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>dbus-message-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 (&handler-><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 (&handler-><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-><a class="code" href="structDBusMessageHandler.html#m1">function</a>; 00124 user_data = handler-><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-><a class="code" href="structDBusMessageHandler.html#m0">refcount</a>.<a class="code" href="structDBusAtomic.html#m0">value</a> = 1; 00180 handler-><a class="code" href="structDBusMessageHandler.html#m1">function</a> = function; 00181 handler-><a class="code" href="structDBusMessageHandler.html#m2">user_data</a> = user_data; 00182 handler-><a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a> = free_user_data; 00183 handler-><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 (&handler-><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 (&handler-><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-><a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>) 00224 (* handler-><a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>) (handler-><a class="code" href="structDBusMessageHandler.html#m2">user_data</a>); 00225 00226 link = _dbus_list_get_first_link (&handler-><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-><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 (&handler-><a class="code" href="structDBusMessageHandler.html#m4">connections</a>, link); 00234 } 00235 00236 _dbus_list_clear (&handler-><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-><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-><a class="code" href="structDBusMessageHandler.html#m3">free_user_data</a>; 00283 old_user_data = handler-><a class="code" href="structDBusMessageHandler.html#m2">user_data</a>; 00284 00285 handler-><a class="code" href="structDBusMessageHandler.html#m2">user_data</a> = user_data; 00286 handler-><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-><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-><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-><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>