<!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-timeout.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-timeout.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font> 00002 <font class="comment">/* dbus-timeout.c DBusTimeout implementation</font> 00003 <font class="comment"> *</font> 00004 <font class="comment"> * Copyright (C) 2003 CodeFactory AB</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-timeout.h"</font> 00026 <font class="preprocessor">#include "dbus-list.h"</font> 00027 <a name="l00039"></a><a class="code" href="structDBusTimeout.html">00039</a> <font class="keyword">struct </font><a class="code" href="structDBusTimeout.html">DBusTimeout</a> 00040 { <a name="l00041"></a><a class="code" href="structDBusTimeout.html#m0">00041</a> <font class="keywordtype">int</font> <a class="code" href="structDBusTimeout.html#m0">refcount</a>; <a name="l00042"></a><a class="code" href="structDBusTimeout.html#m1">00042</a> <font class="keywordtype">int</font> <a class="code" href="structDBusTimeout.html#m1">interval</a>; <a name="l00044"></a><a class="code" href="structDBusTimeout.html#m2">00044</a> DBusTimeoutHandler <a class="code" href="structDBusTimeout.html#m2">handler</a>; <a name="l00045"></a><a class="code" href="structDBusTimeout.html#m3">00045</a> <font class="keywordtype">void</font> *<a class="code" href="structDBusTimeout.html#m3">handler_data</a>; <a name="l00046"></a><a class="code" href="structDBusTimeout.html#m4">00046</a> DBusFreeFunction <a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a>; <a name="l00048"></a><a class="code" href="structDBusTimeout.html#m5">00048</a> <font class="keywordtype">void</font> *<a class="code" href="structDBusTimeout.html#m5">data</a>; <a name="l00049"></a><a class="code" href="structDBusTimeout.html#m6">00049</a> DBusFreeFunction <a class="code" href="structDBusTimeout.html#m6">free_data_function</a>; <a name="l00050"></a><a class="code" href="structDBusTimeout.html#m7">00050</a> <font class="keywordtype">unsigned</font> <font class="keywordtype">int</font> <a class="code" href="structDBusTimeout.html#m7">enabled</a> : 1; 00051 }; 00052 00061 <a class="code" href="structDBusTimeout.html">DBusTimeout</a>* <a name="l00062"></a><a class="code" href="group__DBusTimeoutInternals.html#a0">00062</a> _dbus_timeout_new (<font class="keywordtype">int</font> interval, 00063 DBusTimeoutHandler handler, 00064 <font class="keywordtype">void</font> *data, 00065 DBusFreeFunction free_data_function) 00066 { 00067 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout; 00068 00069 timeout = dbus_new0 (<a class="code" href="structDBusTimeout.html">DBusTimeout</a>, 1); 00070 <font class="keywordflow">if</font> (timeout == NULL) 00071 <font class="keywordflow">return</font> NULL; 00072 00073 timeout-><a class="code" href="structDBusTimeout.html#m0">refcount</a> = 1; 00074 timeout-><a class="code" href="structDBusTimeout.html#m1">interval</a> = interval; 00075 00076 timeout-><a class="code" href="structDBusTimeout.html#m2">handler</a> = handler; 00077 timeout-><a class="code" href="structDBusTimeout.html#m3">handler_data</a> = data; 00078 timeout-><a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a> = free_data_function; 00079 00080 timeout-><a class="code" href="structDBusTimeout.html#m7">enabled</a> = TRUE; 00081 00082 <font class="keywordflow">return</font> timeout; 00083 } 00084 00091 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> * <a name="l00092"></a><a class="code" href="group__DBusTimeoutInternals.html#a1">00092</a> _dbus_timeout_ref (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00093 { 00094 timeout-><a class="code" href="structDBusTimeout.html#m0">refcount</a> += 1; 00095 00096 <font class="keywordflow">return</font> timeout; 00097 } 00098 00105 <font class="keywordtype">void</font> <a name="l00106"></a><a class="code" href="group__DBusTimeoutInternals.html#a2">00106</a> _dbus_timeout_unref (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00107 { 00108 _dbus_assert (timeout != NULL); 00109 _dbus_assert (timeout-><a class="code" href="structDBusTimeout.html#m0">refcount</a> > 0); 00110 00111 timeout-><a class="code" href="structDBusTimeout.html#m0">refcount</a> -= 1; 00112 <font class="keywordflow">if</font> (timeout-><a class="code" href="structDBusTimeout.html#m0">refcount</a> == 0) 00113 { 00114 dbus_timeout_set_data (timeout, NULL, NULL); <font class="comment">/* call free_data_function */</font> 00115 00116 <font class="keywordflow">if</font> (timeout-><a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a>) 00117 (* timeout-><a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a>) (timeout-><a class="code" href="structDBusTimeout.html#m3">handler_data</a>); 00118 00119 dbus_free (timeout); 00120 } 00121 } 00122 00132 <font class="keywordtype">void</font> <a name="l00133"></a><a class="code" href="group__DBusTimeoutInternals.html#a3">00133</a> _dbus_timeout_set_interval (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout, 00134 <font class="keywordtype">int</font> interval) 00135 { 00136 _dbus_assert (interval >= 0); 00137 00138 timeout-><a class="code" href="structDBusTimeout.html#m1">interval</a> = interval; 00139 } 00140 00151 <font class="keywordtype">void</font> <a name="l00152"></a><a class="code" href="group__DBusTimeoutInternals.html#a4">00152</a> _dbus_timeout_set_enabled (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout, 00153 dbus_bool_t enabled) 00154 { 00155 timeout-><a class="code" href="structDBusTimeout.html#m7">enabled</a> = enabled != FALSE; 00156 } 00157 00158 <a name="l00175"></a><a class="code" href="structDBusTimeoutList.html">00175</a> <font class="keyword">struct </font><a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> 00176 { <a name="l00177"></a><a class="code" href="structDBusTimeoutList.html#m0">00177</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>; <a name="l00179"></a><a class="code" href="structDBusTimeoutList.html#m1">00179</a> DBusAddTimeoutFunction <a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a>; <a name="l00180"></a><a class="code" href="structDBusTimeoutList.html#m2">00180</a> DBusRemoveTimeoutFunction <a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a>; <a name="l00181"></a><a class="code" href="structDBusTimeoutList.html#m3">00181</a> DBusTimeoutToggledFunction <a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a>; <a name="l00182"></a><a class="code" href="structDBusTimeoutList.html#m4">00182</a> <font class="keywordtype">void</font> *<a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>; <a name="l00183"></a><a class="code" href="structDBusTimeoutList.html#m5">00183</a> DBusFreeFunction <a class="code" href="structDBusTimeoutList.html#m5">timeout_free_data_function</a>; 00184 }; 00185 00192 <a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a>* <a name="l00193"></a><a class="code" href="group__DBusTimeoutInternals.html#a5">00193</a> _dbus_timeout_list_new (<font class="keywordtype">void</font>) 00194 { 00195 <a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list; 00196 00197 timeout_list = dbus_new0 (<a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a>, 1); 00198 <font class="keywordflow">if</font> (timeout_list == NULL) 00199 <font class="keywordflow">return</font> NULL; 00200 00201 <font class="keywordflow">return</font> timeout_list; 00202 } 00203 00209 <font class="keywordtype">void</font> <a name="l00210"></a><a class="code" href="group__DBusTimeoutInternals.html#a6">00210</a> _dbus_timeout_list_free (<a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list) 00211 { 00212 <font class="comment">/* free timeout_data and remove timeouts as a side effect */</font> 00213 _dbus_timeout_list_set_functions (timeout_list, 00214 NULL, NULL, NULL, NULL, NULL); 00215 00216 _dbus_list_foreach (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, 00217 (DBusForeachFunction) _dbus_timeout_unref, 00218 NULL); 00219 _dbus_list_clear (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>); 00220 00221 dbus_free (timeout_list); 00222 } 00223 00237 dbus_bool_t <a name="l00238"></a><a class="code" href="group__DBusTimeoutInternals.html#a7">00238</a> _dbus_timeout_list_set_functions (<a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list, 00239 DBusAddTimeoutFunction add_function, 00240 DBusRemoveTimeoutFunction remove_function, 00241 DBusTimeoutToggledFunction toggled_function, 00242 <font class="keywordtype">void</font> *data, 00243 DBusFreeFunction free_data_function) 00244 { 00245 <font class="comment">/* Add timeouts with the new function, failing on OOM */</font> 00246 <font class="keywordflow">if</font> (add_function != NULL) 00247 { 00248 <a class="code" href="structDBusList.html">DBusList</a> *link; 00249 00250 link = _dbus_list_get_first_link (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>); 00251 <font class="keywordflow">while</font> (link != NULL) 00252 { 00253 <a class="code" href="structDBusList.html">DBusList</a> *next = _dbus_list_get_next_link (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, 00254 link); 00255 00256 <font class="keywordflow">if</font> (!(* add_function) (link-><a class="code" href="structDBusList.html#m2">data</a>, data)) 00257 { 00258 <font class="comment">/* remove it all again and return FALSE */</font> 00259 <a class="code" href="structDBusList.html">DBusList</a> *link2; 00260 00261 link2 = _dbus_list_get_first_link (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>); 00262 <font class="keywordflow">while</font> (link2 != link) 00263 { 00264 <a class="code" href="structDBusList.html">DBusList</a> *next = _dbus_list_get_next_link (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, 00265 link2); 00266 00267 (* remove_function) (link2-><a class="code" href="structDBusList.html#m2">data</a>, data); 00268 00269 link2 = next; 00270 } 00271 00272 <font class="keywordflow">return</font> FALSE; 00273 } 00274 00275 link = next; 00276 } 00277 } 00278 00279 <font class="comment">/* Remove all current timeouts from previous timeout handlers */</font> 00280 00281 <font class="keywordflow">if</font> (timeout_list-><a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a> != NULL) 00282 { 00283 _dbus_list_foreach (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, 00284 (DBusForeachFunction) timeout_list-><a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a>, 00285 timeout_list-><a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>); 00286 } 00287 00288 <font class="keywordflow">if</font> (timeout_list-><a class="code" href="structDBusTimeoutList.html#m5">timeout_free_data_function</a> != NULL) 00289 (* timeout_list-><a class="code" href="structDBusTimeoutList.html#m5">timeout_free_data_function</a>) (timeout_list-><a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>); 00290 00291 timeout_list-><a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a> = add_function; 00292 timeout_list-><a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a> = remove_function; 00293 timeout_list-><a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a> = toggled_function; 00294 timeout_list-><a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a> = data; 00295 timeout_list-><a class="code" href="structDBusTimeoutList.html#m5">timeout_free_data_function</a> = free_data_function; 00296 00297 <font class="keywordflow">return</font> TRUE; 00298 } 00299 00308 dbus_bool_t <a name="l00309"></a><a class="code" href="group__DBusTimeoutInternals.html#a8">00309</a> _dbus_timeout_list_add_timeout (<a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list, 00310 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00311 { 00312 <font class="keywordflow">if</font> (!_dbus_list_append (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, timeout)) 00313 <font class="keywordflow">return</font> FALSE; 00314 00315 _dbus_timeout_ref (timeout); 00316 00317 <font class="keywordflow">if</font> (timeout_list-><a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a> != NULL) 00318 { 00319 <font class="keywordflow">if</font> (!(* timeout_list-><a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a>) (timeout, 00320 timeout_list-><a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>)) 00321 { 00322 _dbus_list_remove_last (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, timeout); 00323 _dbus_timeout_unref (timeout); 00324 <font class="keywordflow">return</font> FALSE; 00325 } 00326 } 00327 00328 <font class="keywordflow">return</font> TRUE; 00329 } 00330 00338 <font class="keywordtype">void</font> <a name="l00339"></a><a class="code" href="group__DBusTimeoutInternals.html#a9">00339</a> _dbus_timeout_list_remove_timeout (<a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list, 00340 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00341 { 00342 <font class="keywordflow">if</font> (!_dbus_list_remove (&timeout_list-><a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>, timeout)) 00343 _dbus_assert_not_reached (<font class="stringliteral">"Nonexistent timeout was removed"</font>); 00344 00345 <font class="keywordflow">if</font> (timeout_list-><a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a> != NULL) 00346 (* timeout_list-><a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a>) (timeout, 00347 timeout_list-><a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>); 00348 00349 _dbus_timeout_unref (timeout); 00350 } 00351 00360 <font class="keywordtype">void</font> <a name="l00361"></a><a class="code" href="group__DBusTimeoutInternals.html#a10">00361</a> _dbus_timeout_list_toggle_timeout (<a class="code" href="structDBusTimeoutList.html">DBusTimeoutList</a> *timeout_list, 00362 <a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout, 00363 dbus_bool_t enabled) 00364 { 00365 enabled = !!enabled; 00366 00367 <font class="keywordflow">if</font> (enabled == timeout-><a class="code" href="structDBusTimeout.html#m7">enabled</a>) 00368 <font class="keywordflow">return</font>; 00369 00370 timeout-><a class="code" href="structDBusTimeout.html#m7">enabled</a> = enabled; 00371 00372 <font class="keywordflow">if</font> (timeout_list-><a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a> != NULL) 00373 (* timeout_list-><a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a>) (timeout, 00374 timeout_list-><a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>); 00375 } 00376 00411 <font class="keywordtype">int</font> <a name="l00412"></a><a class="code" href="group__DBusTimeout.html#a11">00412</a> dbus_timeout_get_interval (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00413 { 00414 <font class="keywordflow">return</font> timeout-><a class="code" href="structDBusTimeout.html#m1">interval</a>; 00415 } 00416 00424 <font class="keywordtype">void</font>* <a name="l00425"></a><a class="code" href="group__DBusTimeout.html#a12">00425</a> dbus_timeout_get_data (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00426 { 00427 <font class="keywordflow">return</font> timeout-><a class="code" href="structDBusTimeout.html#m5">data</a>; 00428 } 00429 00441 <font class="keywordtype">void</font> <a name="l00442"></a><a class="code" href="group__DBusTimeout.html#a13">00442</a> dbus_timeout_set_data (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout, 00443 <font class="keywordtype">void</font> *data, 00444 DBusFreeFunction free_data_function) 00445 { 00446 <font class="keywordflow">if</font> (timeout-><a class="code" href="structDBusTimeout.html#m6">free_data_function</a> != NULL) 00447 (* timeout-><a class="code" href="structDBusTimeout.html#m6">free_data_function</a>) (timeout-><a class="code" href="structDBusTimeout.html#m5">data</a>); 00448 00449 timeout-><a class="code" href="structDBusTimeout.html#m5">data</a> = data; 00450 timeout-><a class="code" href="structDBusTimeout.html#m6">free_data_function</a> = free_data_function; 00451 } 00452 00467 dbus_bool_t <a name="l00468"></a><a class="code" href="group__DBusTimeout.html#a14">00468</a> dbus_timeout_handle (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00469 { 00470 <font class="keywordflow">return</font> (* timeout-><a class="code" href="structDBusTimeout.html#m2">handler</a>) (timeout-><a class="code" href="structDBusTimeout.html#m3">handler_data</a>); 00471 } 00472 00473 00481 dbus_bool_t <a name="l00482"></a><a class="code" href="group__DBusTimeout.html#a15">00482</a> dbus_timeout_get_enabled (<a class="code" href="structDBusTimeout.html">DBusTimeout</a> *timeout) 00483 { 00484 <font class="keywordflow">return</font> timeout-><a class="code" href="structDBusTimeout.html#m7">enabled</a>; 00485 } 00486 </pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:27 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>