<!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-address.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-address.c</h1><div class="fragment"><pre>00001 <font class="comment">/* -*- mode: C; c-file-style: "gnu" -*- */</font> 00002 <font class="comment">/* dbus-address.c Server address parser.</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 <config.h></font> 00025 <font class="preprocessor">#include "dbus-address.h"</font> 00026 <font class="preprocessor">#include "dbus-internals.h"</font> 00027 <font class="preprocessor">#include "dbus-list.h"</font> 00028 <font class="preprocessor">#include "dbus-string.h"</font> 00029 <a name="l00041"></a><a class="code" href="structDBusAddressEntry.html">00041</a> <font class="keyword">struct </font><a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> 00042 { <a name="l00043"></a><a class="code" href="structDBusAddressEntry.html#m0">00043</a> <a class="code" href="structDBusString.html">DBusString</a> <a class="code" href="structDBusAddressEntry.html#m0">method</a>; <a name="l00045"></a><a class="code" href="structDBusAddressEntry.html#m1">00045</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusAddressEntry.html#m1">keys</a>; <a name="l00046"></a><a class="code" href="structDBusAddressEntry.html#m2">00046</a> <a class="code" href="structDBusList.html">DBusList</a> *<a class="code" href="structDBusAddressEntry.html#m2">values</a>; 00047 }; 00048 <font class="comment">/* End of internals */</font> 00050 00051 <font class="keyword">static</font> <font class="keywordtype">void</font> 00052 dbus_address_entry_free (<a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> *entry) 00053 { 00054 <a class="code" href="structDBusList.html">DBusList</a> *link; 00055 00056 _dbus_string_free (&entry-><a class="code" href="structDBusAddressEntry.html#m0">method</a>); 00057 00058 link = _dbus_list_get_first_link (&entry-><a class="code" href="structDBusAddressEntry.html#m1">keys</a>); 00059 <font class="keywordflow">while</font> (link != NULL) 00060 { 00061 _dbus_string_free (link-><a class="code" href="structDBusList.html#m2">data</a>); 00062 dbus_free (link-><a class="code" href="structDBusList.html#m2">data</a>); 00063 00064 link = _dbus_list_get_next_link (&entry-><a class="code" href="structDBusAddressEntry.html#m1">keys</a>, link); 00065 } 00066 _dbus_list_clear (&entry-><a class="code" href="structDBusAddressEntry.html#m1">keys</a>); 00067 00068 link = _dbus_list_get_first_link (&entry-><a class="code" href="structDBusAddressEntry.html#m2">values</a>); 00069 <font class="keywordflow">while</font> (link != NULL) 00070 { 00071 _dbus_string_free (link-><a class="code" href="structDBusList.html#m2">data</a>); 00072 dbus_free (link-><a class="code" href="structDBusList.html#m2">data</a>); 00073 00074 link = _dbus_list_get_next_link (&entry-><a class="code" href="structDBusAddressEntry.html#m2">values</a>, link); 00075 } 00076 _dbus_list_clear (&entry-><a class="code" href="structDBusAddressEntry.html#m2">values</a>); 00077 00078 dbus_free (entry); 00079 } 00080 00094 <font class="keywordtype">void</font> <a name="l00095"></a><a class="code" href="group__DBusAddress.html#a0">00095</a> dbus_address_entries_free (<a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> **entries) 00096 { 00097 <font class="keywordtype">int</font> i; 00098 00099 <font class="keywordflow">for</font> (i = 0; entries[i] != NULL; i++) 00100 dbus_address_entry_free (entries[i]); 00101 dbus_free (entries); 00102 } 00103 00104 <font class="keyword">static</font> <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> * 00105 create_entry (<font class="keywordtype">void</font>) 00106 { 00107 <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> *entry; 00108 00109 entry = dbus_new0 (<a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a>, 1); 00110 00111 <font class="keywordflow">if</font> (entry == NULL) 00112 <font class="keywordflow">return</font> NULL; 00113 00114 <font class="keywordflow">if</font> (!_dbus_string_init (&entry-><a class="code" href="structDBusAddressEntry.html#m0">method</a>)) 00115 { 00116 dbus_free (entry); 00117 <font class="keywordflow">return</font> NULL; 00118 } 00119 00120 <font class="keywordflow">return</font> entry; 00121 } 00122 00130 <font class="keyword">const</font> <font class="keywordtype">char</font> * <a name="l00131"></a><a class="code" href="group__DBusAddress.html#a2">00131</a> dbus_address_entry_get_method (<a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> *entry) 00132 { 00133 <font class="keywordflow">return</font> _dbus_string_get_const_data (&entry-><a class="code" href="structDBusAddressEntry.html#m0">method</a>); 00134 } 00135 00143 <font class="keyword">const</font> <font class="keywordtype">char</font> * <a name="l00144"></a><a class="code" href="group__DBusAddress.html#a3">00144</a> dbus_address_entry_get_value (<a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> *entry, 00145 <font class="keyword">const</font> <font class="keywordtype">char</font> *key) 00146 { 00147 <a class="code" href="structDBusList.html">DBusList</a> *values, *keys; 00148 00149 keys = _dbus_list_get_first_link (&entry-><a class="code" href="structDBusAddressEntry.html#m1">keys</a>); 00150 values = _dbus_list_get_first_link (&entry-><a class="code" href="structDBusAddressEntry.html#m2">values</a>); 00151 00152 <font class="keywordflow">while</font> (keys != NULL) 00153 { 00154 _dbus_assert (values != NULL); 00155 00156 <font class="keywordflow">if</font> (_dbus_string_equal_c_str (keys-><a class="code" href="structDBusList.html#m2">data</a>, key)) 00157 <font class="keywordflow">return</font> _dbus_string_get_const_data (values-><a class="code" href="structDBusList.html#m2">data</a>); 00158 00159 keys = _dbus_list_get_next_link (&entry-><a class="code" href="structDBusAddressEntry.html#m1">keys</a>, keys); 00160 values = _dbus_list_get_next_link (&entry-><a class="code" href="structDBusAddressEntry.html#m2">values</a>, values); 00161 } 00162 00163 <font class="keywordflow">return</font> NULL; 00164 } 00165 00182 dbus_bool_t <a name="l00183"></a><a class="code" href="group__DBusAddress.html#a4">00183</a> dbus_parse_address (<font class="keyword">const</font> <font class="keywordtype">char</font> *address, 00184 <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> ***entry, 00185 <font class="keywordtype">int</font> *array_len, 00186 <a class="code" href="structDBusError.html">DBusError</a> *error) 00187 { 00188 <a class="code" href="structDBusString.html">DBusString</a> str; 00189 <font class="keywordtype">int</font> pos, end_pos, len, i; 00190 <a class="code" href="structDBusList.html">DBusList</a> *entries, *link; 00191 <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> **entry_array; 00192 00193 _DBUS_ASSERT_ERROR_IS_CLEAR (error); 00194 00195 _dbus_string_init_const (&str, address); 00196 00197 entries = NULL; 00198 pos = 0; 00199 len = _dbus_string_get_length (&str); 00200 00201 <font class="keywordflow">while</font> (pos < len) 00202 { 00203 <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> *entry; 00204 00205 <font class="keywordtype">int</font> found_pos; 00206 00207 entry = create_entry (); 00208 <font class="keywordflow">if</font> (!entry) 00209 { 00210 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00211 00212 <font class="keywordflow">goto</font> error; 00213 } 00214 00215 <font class="comment">/* Append the entry */</font> 00216 <font class="keywordflow">if</font> (!_dbus_list_append (&entries, entry)) 00217 { 00218 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00219 dbus_address_entry_free (entry); 00220 <font class="keywordflow">goto</font> error; 00221 } 00222 00223 <font class="comment">/* Look for a semi-colon */</font> 00224 <font class="keywordflow">if</font> (!_dbus_string_find (&str, pos, <font class="stringliteral">";"</font>, &end_pos)) 00225 end_pos = len; 00226 00227 <font class="comment">/* Look for the colon : */</font> 00228 <font class="keywordflow">if</font> (!_dbus_string_find_to (&str, pos, end_pos, <font class="stringliteral">":"</font>, &found_pos)) 00229 { 00230 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS, <font class="stringliteral">"Address does not contain a colon"</font>); 00231 <font class="keywordflow">goto</font> error; 00232 } 00233 00234 <font class="keywordflow">if</font> (!_dbus_string_copy_len (&str, pos, found_pos - pos, &entry-><a class="code" href="structDBusAddressEntry.html#m0">method</a>, 0)) 00235 { 00236 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00237 <font class="keywordflow">goto</font> error; 00238 } 00239 00240 pos = found_pos + 1; 00241 00242 <font class="keywordflow">while</font> (pos < end_pos) 00243 { 00244 <font class="keywordtype">int</font> comma_pos, equals_pos; 00245 00246 <font class="keywordflow">if</font> (!_dbus_string_find_to (&str, pos, end_pos, <font class="stringliteral">","</font>, &comma_pos)) 00247 comma_pos = end_pos; 00248 00249 <font class="keywordflow">if</font> (!_dbus_string_find_to (&str, pos, comma_pos, <font class="stringliteral">"="</font>, &equals_pos) || 00250 equals_pos == pos || equals_pos + 1 == comma_pos) 00251 { 00252 dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS, 00253 <font class="stringliteral">"'=' character not found or has no value following it"</font>); 00254 <font class="keywordflow">goto</font> error; 00255 } 00256 <font class="keywordflow">else</font> 00257 { 00258 <a class="code" href="structDBusString.html">DBusString</a> *key; 00259 <a class="code" href="structDBusString.html">DBusString</a> *value; 00260 00261 key = dbus_new0 (<a class="code" href="structDBusString.html">DBusString</a>, 1); 00262 00263 <font class="keywordflow">if</font> (!key) 00264 { 00265 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00266 <font class="keywordflow">goto</font> error; 00267 } 00268 00269 value = dbus_new0 (<a class="code" href="structDBusString.html">DBusString</a>, 1); 00270 <font class="keywordflow">if</font> (!value) 00271 { 00272 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00273 dbus_free (key); 00274 <font class="keywordflow">goto</font> error; 00275 } 00276 00277 <font class="keywordflow">if</font> (!_dbus_string_init (key)) 00278 { 00279 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00280 dbus_free (key); 00281 dbus_free (value); 00282 00283 <font class="keywordflow">goto</font> error; 00284 } 00285 00286 <font class="keywordflow">if</font> (!_dbus_string_init (value)) 00287 { 00288 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00289 _dbus_string_free (key); 00290 00291 dbus_free (key); 00292 dbus_free (value); 00293 <font class="keywordflow">goto</font> error; 00294 } 00295 00296 <font class="keywordflow">if</font> (!_dbus_string_copy_len (&str, pos, equals_pos - pos, key, 0)) 00297 { 00298 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00299 _dbus_string_free (key); 00300 _dbus_string_free (value); 00301 00302 dbus_free (key); 00303 dbus_free (value); 00304 <font class="keywordflow">goto</font> error; 00305 } 00306 00307 <font class="keywordflow">if</font> (!_dbus_string_copy_len (&str, equals_pos + 1, comma_pos - equals_pos - 1, value, 0)) 00308 { 00309 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00310 _dbus_string_free (key); 00311 _dbus_string_free (value); 00312 00313 dbus_free (key); 00314 dbus_free (value); 00315 <font class="keywordflow">goto</font> error; 00316 } 00317 00318 <font class="keywordflow">if</font> (!_dbus_list_append (&entry-><a class="code" href="structDBusAddressEntry.html#m1">keys</a>, key)) 00319 { 00320 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00321 _dbus_string_free (key); 00322 _dbus_string_free (value); 00323 00324 dbus_free (key); 00325 dbus_free (value); 00326 <font class="keywordflow">goto</font> error; 00327 } 00328 00329 <font class="keywordflow">if</font> (!_dbus_list_append (&entry-><a class="code" href="structDBusAddressEntry.html#m2">values</a>, value)) 00330 { 00331 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00332 _dbus_string_free (value); 00333 00334 dbus_free (value); 00335 <font class="keywordflow">goto</font> error; 00336 } 00337 } 00338 00339 pos = comma_pos + 1; 00340 } 00341 00342 pos = end_pos + 1; 00343 } 00344 00345 *array_len = _dbus_list_get_length (&entries); 00346 00347 entry_array = dbus_new (<a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> *, *array_len + 1); 00348 00349 <font class="keywordflow">if</font> (!entry_array) 00350 { 00351 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 00352 00353 <font class="keywordflow">goto</font> error; 00354 } 00355 00356 entry_array [*array_len] = NULL; 00357 00358 link = _dbus_list_get_first_link (&entries); 00359 i = 0; 00360 <font class="keywordflow">while</font> (link != NULL) 00361 { 00362 entry_array[i] = link-><a class="code" href="structDBusList.html#m2">data</a>; 00363 i++; 00364 link = _dbus_list_get_next_link (&entries, link); 00365 } 00366 00367 _dbus_list_clear (&entries); 00368 *entry = entry_array; 00369 00370 <font class="keywordflow">return</font> TRUE; 00371 00372 error: 00373 00374 link = _dbus_list_get_first_link (&entries); 00375 <font class="keywordflow">while</font> (link != NULL) 00376 { 00377 dbus_address_entry_free (link-><a class="code" href="structDBusList.html#m2">data</a>); 00378 link = _dbus_list_get_next_link (&entries, link); 00379 } 00380 00381 _dbus_list_clear (&entries); 00382 00383 <font class="keywordflow">return</font> FALSE; 00384 00385 } 00386 00387 <font class="comment">/* End of public API */</font> 00389 00390 <font class="preprocessor">#ifdef DBUS_BUILD_TESTS</font> 00391 <font class="preprocessor"></font><font class="preprocessor">#include "dbus-test.h"</font> 00392 00393 dbus_bool_t 00394 _dbus_address_test (<font class="keywordtype">void</font>) 00395 { 00396 <a class="code" href="structDBusAddressEntry.html">DBusAddressEntry</a> **entries; 00397 <font class="keywordtype">int</font> len; 00398 <a class="code" href="structDBusError.html">DBusError</a> error; 00399 00400 dbus_error_init (&error); 00401 00402 <font class="keywordflow">if</font> (!dbus_parse_address (<font class="stringliteral">"unix:path=/tmp/foo;debug:name=test,sliff=sloff;"</font>, 00403 &entries, &len, &error)) 00404 _dbus_assert_not_reached (<font class="stringliteral">"could not parse address"</font>); 00405 _dbus_assert (len == 2); 00406 _dbus_assert (strcmp (dbus_address_entry_get_value (entries[0], <font class="stringliteral">"path"</font>), <font class="stringliteral">"/tmp/foo"</font>) == 0); 00407 _dbus_assert (strcmp (dbus_address_entry_get_value (entries[1], <font class="stringliteral">"name"</font>), <font class="stringliteral">"test"</font>) == 0); 00408 _dbus_assert (strcmp (dbus_address_entry_get_value (entries[1], <font class="stringliteral">"sliff"</font>), <font class="stringliteral">"sloff"</font>) == 0); 00409 00410 dbus_address_entries_free (entries); 00411 00412 <font class="comment">/* Different possible errors */</font> 00413 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo"</font>, &entries, &len, &error)) 00414 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00415 <font class="keywordflow">else</font> 00416 dbus_error_free (&error); 00417 00418 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar"</font>, &entries, &len, &error)) 00419 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00420 <font class="keywordflow">else</font> 00421 dbus_error_free (&error); 00422 00423 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar,baz"</font>, &entries, &len, &error)) 00424 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00425 <font class="keywordflow">else</font> 00426 dbus_error_free (&error); 00427 00428 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar=foo,baz"</font>, &entries, &len, &error)) 00429 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00430 <font class="keywordflow">else</font> 00431 dbus_error_free (&error); 00432 00433 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar=foo;baz"</font>, &entries, &len, &error)) 00434 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00435 <font class="keywordflow">else</font> 00436 dbus_error_free (&error); 00437 00438 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:=foo"</font>, &entries, &len, &error)) 00439 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00440 <font class="keywordflow">else</font> 00441 dbus_error_free (&error); 00442 00443 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:foo="</font>, &entries, &len, &error)) 00444 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00445 <font class="keywordflow">else</font> 00446 dbus_error_free (&error); 00447 00448 <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:foo,bar=baz"</font>, &entries, &len, &error)) 00449 _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>); 00450 <font class="keywordflow">else</font> 00451 dbus_error_free (&error); 00452 00453 <font class="keywordflow">return</font> TRUE; 00454 } 00455 00456 <font class="preprocessor">#endif</font> </pre></div><hr><address align="right"><small>Generated on Wed Jun 9 05:01:24 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>