<!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> <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>test-thread-server.c</h1><div class="fragment"><pre>00001 <font class="preprocessor">#include <glib.h></font> 00002 <font class="preprocessor">#include "dbus-glib.h"</font> 00003 <font class="preprocessor">#include <stdio.h></font> 00004 <font class="preprocessor">#include <string.h></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, &iter); 00047 00048 <font class="keywordflow">if</font> (dbus_message_iter_get_arg_type (&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 (&iter); 00054 <font class="keywordflow">if</font> (threadnr < 0 || threadnr >= 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 (&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 (&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 (&iter); 00073 00074 <font class="keywordflow">if</font> (counter != data->counters[threadnr]) 00075 { 00076 g_print (<font class="stringliteral">"Thread %d, counter %d, expected %d\n"</font>, threadnr, counter, data->counters[threadnr]); 00077 <font class="keywordflow">goto</font> out; 00078 } 00079 data->counters[threadnr]++; 00080 00081 <font class="keywordflow">if</font> (! dbus_message_iter_next (&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 (&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 (&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 (&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 < N_TEST_THREADS; i++) 00120 { 00121 g_string_append_printf (counter_str, <font class="stringliteral">"%d "</font>, data->counters[i]); 00122 } 00123 g_print (<font class="stringliteral">"%s\r"</font>, counter_str->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 < 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 (&error); 00216 server = dbus_server_listen (argv[1], &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 (&error); 00222 <font class="keywordflow">return</font> 1; 00223 } 00224 00225 <font class="keywordflow">if</font> (!dbus_connection_allocate_data_slot (&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>