Sophie

Sophie

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

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>test-thread-server.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>test-thread-server.c</h1><div class="fragment"><pre>00001 <font class="preprocessor">#include &lt;glib.h&gt;</font>
00002 <font class="preprocessor">#include "dbus-glib.h"</font>
00003 <font class="preprocessor">#include &lt;stdio.h&gt;</font>
00004 <font class="preprocessor">#include &lt;string.h&gt;</font>
00005 
00006 <font class="preprocessor">#include "test-thread.h"</font>
00007 
00008 <font class="keyword">typedef</font> <font class="keyword">struct </font>{
00009   guint32 counters[N_TEST_THREADS];
00010 } ThreadTestData;
00011 
00012 <font class="keyword">static</font> ThreadTestData *
00013 thread_test_data_new (<font class="keywordtype">void</font>)
00014 {
00015   ThreadTestData *data;
00016 
00017   data = g_new0 (ThreadTestData, 1);
00018   
00019   <font class="keywordflow">return</font> data;
00020 }
00021 
00022 <font class="keyword">static</font> <font class="keywordtype">void</font>
00023 thread_test_data_free (ThreadTestData *data)
00024 {
00025   g_free (data);
00026 }
00027 
00028 <font class="keyword">static</font> <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *disconnect_handler;
00029 <font class="keyword">static</font> <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *filter_handler;
00030 <font class="keyword">static</font> dbus_int32_t handler_slot = -1;
00031 
00032 <font class="keyword">static</font> DBusHandlerResult
00033 handle_test_message (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00034                      <a class="code" href="structDBusConnection.html">DBusConnection</a>     *connection,
00035                      <a class="code" href="structDBusMessage.html">DBusMessage</a>        *message,
00036                      <font class="keywordtype">void</font>               *user_data)
00037 {
00038   ThreadTestData *data = user_data;
00039   <a class="code" href="structDBusMessageIter.html">DBusMessageIter</a> iter;
00040   gint32 threadnr;
00041   guint32 counter;
00042   <font class="keywordtype">char</font> *str, *expected_str;
00043   GString *counter_str;
00044   <font class="keywordtype">int</font> i;
00045   
00046   dbus_message_iter_init (message, &amp;iter);
00047   
00048   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_INT32)
00049     {
00050       g_print (<font class="stringliteral">"First arg not right type\n"</font>);
00051       <font class="keywordflow">goto</font> out;
00052     }
00053   threadnr = dbus_message_iter_get_int32 (&amp;iter);
00054   <font class="keywordflow">if</font> (threadnr &lt; 0 || threadnr &gt;= N_TEST_THREADS)
00055     {
00056       g_print (<font class="stringliteral">"Invalid thread nr\n"</font>);
00057       <font class="keywordflow">goto</font> out;
00058     }
00059 
00060   <font class="keywordflow">if</font> (! dbus_message_iter_next (&amp;iter))
00061     {
00062       g_print (<font class="stringliteral">"Couldn't get second arg\n"</font>);
00063       <font class="keywordflow">goto</font> out;
00064     }
00065 
00066   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_UINT32)
00067     {
00068       g_print (<font class="stringliteral">"Second arg not right type\n"</font>);
00069       <font class="keywordflow">goto</font> out;
00070     }
00071   
00072   counter = dbus_message_iter_get_uint32 (&amp;iter);
00073 
00074   <font class="keywordflow">if</font> (counter != data-&gt;counters[threadnr])
00075     {
00076       g_print (<font class="stringliteral">"Thread %d, counter %d, expected %d\n"</font>, threadnr, counter, data-&gt;counters[threadnr]);
00077       <font class="keywordflow">goto</font> out;
00078     }
00079   data-&gt;counters[threadnr]++;
00080   
00081   <font class="keywordflow">if</font> (! dbus_message_iter_next (&amp;iter))
00082     {
00083       g_print (<font class="stringliteral">"Couldn't get third arg\n"</font>);
00084       <font class="keywordflow">goto</font> out;
00085     }
00086 
00087   <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&amp;iter) != DBUS_TYPE_STRING)
00088     {
00089       g_print (<font class="stringliteral">"Third arg not right type\n"</font>);
00090       <font class="keywordflow">goto</font> out;
00091     }
00092 
00093   str = dbus_message_iter_get_string (&amp;iter);
00094 
00095   <font class="keywordflow">if</font> (str == NULL)
00096     {
00097       g_print (<font class="stringliteral">"No third arg\n"</font>);
00098       <font class="keywordflow">goto</font> out;
00099     }
00100 
00101   expected_str = g_strdup_printf (<font class="stringliteral">"Thread %d-%d\n"</font>, threadnr, counter);
00102   <font class="keywordflow">if</font> (strcmp (expected_str, str) != 0)
00103     {
00104       g_print (<font class="stringliteral">"Wrong string '%s', expected '%s'\n"</font>, str, expected_str);
00105       <font class="keywordflow">goto</font> out;
00106     }
00107   g_free (str);
00108   g_free (expected_str);
00109 
00110   <font class="keywordflow">if</font> (dbus_message_iter_next (&amp;iter))
00111     {
00112       g_print (<font class="stringliteral">"Extra args on end of message\n"</font>);
00113       <font class="keywordflow">goto</font> out;
00114     }
00115   
00116   dbus_connection_flush (connection);
00117 
00118   counter_str = g_string_new (<font class="stringliteral">""</font>);
00119   <font class="keywordflow">for</font> (i = 0; i &lt; N_TEST_THREADS; i++)
00120     {
00121       g_string_append_printf (counter_str, <font class="stringliteral">"%d "</font>, data-&gt;counters[i]);
00122     }
00123   g_print (<font class="stringliteral">"%s\r"</font>, counter_str-&gt;str);
00124   g_string_free (counter_str, TRUE);
00125   
00126  out:
00127   <font class="keywordflow">return</font> DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
00128 }
00129 
00130 <font class="keyword">static</font> DBusHandlerResult
00131 handle_filter (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00132                <a class="code" href="structDBusConnection.html">DBusConnection</a>     *connection,
00133                <a class="code" href="structDBusMessage.html">DBusMessage</a>        *message,
00134                <font class="keywordtype">void</font>               *user_data)
00135 {
00136   <font class="keywordflow">return</font> DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
00137 }
00138 
00139 <font class="keyword">static</font> DBusHandlerResult
00140 handle_disconnect (<a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *handler,
00141                    <a class="code" href="structDBusConnection.html">DBusConnection</a>     *connection,
00142                    <a class="code" href="structDBusMessage.html">DBusMessage</a>        *message,
00143                    <font class="keywordtype">void</font>               *user_data)
00144 {
00145   g_print (<font class="stringliteral">"connection disconnected\n"</font>);
00146   dbus_connection_unref (connection);
00147 
00148   <font class="keywordflow">return</font> DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
00149 }
00150 
00151 
00152 <font class="keyword">static</font> <font class="keywordtype">void</font>
00153 new_connection_callback (<a class="code" href="structDBusServer.html">DBusServer</a>     *server,
00154                          <a class="code" href="structDBusConnection.html">DBusConnection</a> *new_connection,
00155                          <font class="keywordtype">void</font>           *user_data)
00156 {
00157   <font class="keyword">const</font> <font class="keywordtype">char</font> *test_messages[] = { <font class="stringliteral">"org.freedesktop.ThreadTest"</font> };
00158   <font class="keyword">const</font> <font class="keywordtype">char</font> *disconnect_messages[] = { <font class="stringliteral">"org.freedesktop.Local.Disconnect"</font> };
00159   <a class="code" href="structDBusMessageHandler.html">DBusMessageHandler</a> *test_message_handler;
00160   ThreadTestData * data;
00161 
00162   g_print (<font class="stringliteral">"new_connection_callback\n"</font>);
00163   
00164   dbus_connection_ref (new_connection);
00165   dbus_connection_setup_with_g_main (new_connection, NULL);
00166 
00167   data = thread_test_data_new ();
00168   
00169   test_message_handler =
00170     dbus_message_handler_new (handle_test_message,
00171                               data, (DBusFreeFunction)thread_test_data_free);
00172   
00173   <font class="keywordflow">if</font> (!dbus_connection_register_handler (new_connection,
00174                                          test_message_handler,
00175                                          test_messages, 1))
00176     <font class="keywordflow">goto</font> nomem;
00177 
00178   <font class="keywordflow">if</font> (!dbus_connection_set_data (new_connection,
00179                                  handler_slot,
00180                                  test_message_handler,
00181                                  (DBusFreeFunction)dbus_message_handler_unref))
00182     <font class="keywordflow">goto</font> nomem;
00183   
00184   <font class="keywordflow">if</font> (!dbus_connection_register_handler (new_connection,
00185                                          disconnect_handler,
00186                                          disconnect_messages, 1))
00187     <font class="keywordflow">goto</font> nomem;
00188   
00189   <font class="keywordflow">if</font> (!dbus_connection_add_filter (new_connection,
00190                                    filter_handler))
00191     <font class="keywordflow">goto</font> nomem;
00192 
00193   <font class="keywordflow">return</font>;
00194   
00195  nomem:
00196   g_error (<font class="stringliteral">"no memory to setup new connection"</font>);
00197 }
00198 
00199 <font class="keywordtype">int</font>
00200 main (<font class="keywordtype">int</font> argc, <font class="keywordtype">char</font> *argv[])
00201 {
00202   GMainLoop *loop;
00203   <a class="code" href="structDBusServer.html">DBusServer</a> *server;
00204   <a class="code" href="structDBusError.html">DBusError</a> error;
00205 
00206   g_thread_init (NULL);
00207   dbus_gthread_init ();
00208   
00209   <font class="keywordflow">if</font> (argc &lt; 2)
00210     {
00211       fprintf (stderr, <font class="stringliteral">"Give the server address as an argument\n"</font>);
00212       <font class="keywordflow">return</font> 1;
00213     }
00214 
00215   dbus_error_init (&amp;error);
00216   server = dbus_server_listen (argv[1], &amp;error);
00217   <font class="keywordflow">if</font> (server == NULL)
00218     {
00219       fprintf (stderr, <font class="stringliteral">"Failed to start server on %s: %s\n"</font>,
00220                argv[1], error.<a class="code" href="structDBusError.html#m1">message</a>);
00221       dbus_error_free (&amp;error);
00222       <font class="keywordflow">return</font> 1;
00223     }
00224 
00225   <font class="keywordflow">if</font> (!dbus_connection_allocate_data_slot (&amp;handler_slot))
00226     g_error (<font class="stringliteral">"no memory for data slot"</font>);
00227   
00228   filter_handler =
00229     dbus_message_handler_new (handle_filter, NULL, NULL);
00230   <font class="keywordflow">if</font> (filter_handler == NULL)
00231     g_error (<font class="stringliteral">"no memory for handler"</font>);
00232   
00233   disconnect_handler =
00234     dbus_message_handler_new (handle_disconnect, NULL, NULL);
00235   <font class="keywordflow">if</font> (disconnect_handler == NULL)
00236     g_error (<font class="stringliteral">"no memory for handler"</font>);
00237   
00238   dbus_server_set_new_connection_function (server,
00239                                            new_connection_callback,
00240                                            NULL, NULL);
00241 
00242   dbus_server_setup_with_g_main (server, NULL);
00243   
00244   loop = g_main_loop_new (NULL, FALSE);
00245   g_main_run (loop);  
00246 
00247   <font class="keywordflow">return</font> 0;
00248 }
</pre></div><hr><address align="right"><small>Generated on Wed Jun 2 06:01:34 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>