Sophie

Sophie

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

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-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> &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-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-&gt;<a class="code" href="structDBusTimeout.html#m0">refcount</a> = 1;
00074   timeout-&gt;<a class="code" href="structDBusTimeout.html#m1">interval</a> = interval;
00075 
00076   timeout-&gt;<a class="code" href="structDBusTimeout.html#m2">handler</a> = handler;
00077   timeout-&gt;<a class="code" href="structDBusTimeout.html#m3">handler_data</a> = data;
00078   timeout-&gt;<a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a> = free_data_function;
00079 
00080   timeout-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTimeout.html#m0">refcount</a> &gt; 0);
00110   
00111   timeout-&gt;<a class="code" href="structDBusTimeout.html#m0">refcount</a> -= 1;
00112   <font class="keywordflow">if</font> (timeout-&gt;<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-&gt;<a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a>)
00117         (* timeout-&gt;<a class="code" href="structDBusTimeout.html#m4">free_handler_data_function</a>) (timeout-&gt;<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 &gt;= 0);
00137   
00138   timeout-&gt;<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-&gt;<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 (&amp;timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>,
00217                       (DBusForeachFunction) _dbus_timeout_unref,
00218                       NULL);
00219   _dbus_list_clear (&amp;timeout_list-&gt;<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 (&amp;timeout_list-&gt;<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 (&amp;timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>,
00254                                                      link);
00255       
00256           <font class="keywordflow">if</font> (!(* add_function) (link-&gt;<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 (&amp;timeout_list-&gt;<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 (&amp;timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>,
00265                                                              link2);
00266 
00267                   (* remove_function) (link2-&gt;<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-&gt;<a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a> != NULL)
00282     {
00283       _dbus_list_foreach (&amp;timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m0">timeouts</a>,
00284                           (DBusForeachFunction) timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a>,
00285                           timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>);
00286     }
00287 
00288   <font class="keywordflow">if</font> (timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m5">timeout_free_data_function</a> != NULL)
00289     (* timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m5">timeout_free_data_function</a>) (timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>);
00290 
00291   timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a> = add_function;
00292   timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a> = remove_function;
00293   timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a> = toggled_function;
00294   timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a> = data;
00295   timeout_list-&gt;<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 (&amp;timeout_list-&gt;<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-&gt;<a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a> != NULL)
00318     {
00319       <font class="keywordflow">if</font> (!(* timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m1">add_timeout_function</a>) (timeout,
00320                                                    timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m4">timeout_data</a>))
00321         {
00322           _dbus_list_remove_last (&amp;timeout_list-&gt;<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 (&amp;timeout_list-&gt;<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-&gt;<a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a> != NULL)
00346     (* timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m2">remove_timeout_function</a>) (timeout,
00347                                                timeout_list-&gt;<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-&gt;<a class="code" href="structDBusTimeout.html#m7">enabled</a>)
00368     <font class="keywordflow">return</font>;
00369 
00370   timeout-&gt;<a class="code" href="structDBusTimeout.html#m7">enabled</a> = enabled;
00371   
00372   <font class="keywordflow">if</font> (timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a> != NULL)
00373     (* timeout_list-&gt;<a class="code" href="structDBusTimeoutList.html#m3">timeout_toggled_function</a>) (timeout,
00374                                                 timeout_list-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structDBusTimeout.html#m6">free_data_function</a> != NULL)
00447     (* timeout-&gt;<a class="code" href="structDBusTimeout.html#m6">free_data_function</a>) (timeout-&gt;<a class="code" href="structDBusTimeout.html#m5">data</a>);
00448 
00449   timeout-&gt;<a class="code" href="structDBusTimeout.html#m5">data</a> = data;
00450   timeout-&gt;<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-&gt;<a class="code" href="structDBusTimeout.html#m2">handler</a>) (timeout-&gt;<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-&gt;<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>