Sophie

Sophie

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

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-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> &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-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 &lt;config.h&gt;</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 (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m0">method</a>);
00057 
00058   link = _dbus_list_get_first_link (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m1">keys</a>);
00059   <font class="keywordflow">while</font> (link != NULL)
00060     {
00061       _dbus_string_free (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
00062       dbus_free (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
00063       
00064       link = _dbus_list_get_next_link (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m1">keys</a>, link);
00065     }
00066   _dbus_list_clear (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m1">keys</a>);
00067   
00068   link = _dbus_list_get_first_link (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m2">values</a>);
00069   <font class="keywordflow">while</font> (link != NULL)
00070     {
00071       _dbus_string_free (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
00072       dbus_free (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
00073       
00074       link = _dbus_list_get_next_link (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m2">values</a>, link);
00075     }
00076   _dbus_list_clear (&amp;entry-&gt;<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 (&amp;entry-&gt;<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 (&amp;entry-&gt;<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 (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m1">keys</a>);
00150   values = _dbus_list_get_first_link (&amp;entry-&gt;<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-&gt;<a class="code" href="structDBusList.html#m2">data</a>, key))
00157         <font class="keywordflow">return</font> _dbus_string_get_const_data (values-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
00158 
00159       keys = _dbus_list_get_next_link (&amp;entry-&gt;<a class="code" href="structDBusAddressEntry.html#m1">keys</a>, keys);
00160       values = _dbus_list_get_next_link (&amp;entry-&gt;<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 (&amp;str, address);
00196 
00197   entries = NULL;
00198   pos = 0;
00199   len = _dbus_string_get_length (&amp;str);
00200   
00201   <font class="keywordflow">while</font> (pos &lt; 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 (&amp;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 (&amp;str, pos, <font class="stringliteral">";"</font>, &amp;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 (&amp;str, pos, end_pos, <font class="stringliteral">":"</font>, &amp;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 (&amp;str, pos, found_pos - pos, &amp;entry-&gt;<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 &lt; end_pos)
00243         {
00244           <font class="keywordtype">int</font> comma_pos, equals_pos;
00245 
00246           <font class="keywordflow">if</font> (!_dbus_string_find_to (&amp;str, pos, end_pos, <font class="stringliteral">","</font>, &amp;comma_pos))
00247             comma_pos = end_pos;
00248           
00249           <font class="keywordflow">if</font> (!_dbus_string_find_to (&amp;str, pos, comma_pos, <font class="stringliteral">"="</font>, &amp;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 (&amp;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 (&amp;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 (&amp;entry-&gt;<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 (&amp;entry-&gt;<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 (&amp;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 (&amp;entries);
00359   i = 0;
00360   <font class="keywordflow">while</font> (link != NULL)
00361     {
00362       entry_array[i] = link-&gt;<a class="code" href="structDBusList.html#m2">data</a>;
00363       i++;
00364       link = _dbus_list_get_next_link (&amp;entries, link);
00365     }
00366 
00367   _dbus_list_clear (&amp;entries);
00368   *entry = entry_array;
00369 
00370   <font class="keywordflow">return</font> TRUE;
00371 
00372  error:
00373   
00374   link = _dbus_list_get_first_link (&amp;entries);
00375   <font class="keywordflow">while</font> (link != NULL)
00376     {
00377       dbus_address_entry_free (link-&gt;<a class="code" href="structDBusList.html#m2">data</a>);
00378       link = _dbus_list_get_next_link (&amp;entries, link);
00379     }
00380 
00381   _dbus_list_clear (&amp;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 (&amp;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                            &amp;entries, &amp;len, &amp;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>, &amp;entries, &amp;len, &amp;error))
00414     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00415   <font class="keywordflow">else</font>
00416     dbus_error_free (&amp;error);
00417   
00418   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar"</font>, &amp;entries, &amp;len, &amp;error))
00419     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00420   <font class="keywordflow">else</font>
00421     dbus_error_free (&amp;error);
00422   
00423   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar,baz"</font>, &amp;entries, &amp;len, &amp;error))
00424     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00425   <font class="keywordflow">else</font>
00426     dbus_error_free (&amp;error);
00427   
00428   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar=foo,baz"</font>, &amp;entries, &amp;len, &amp;error))
00429     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00430   <font class="keywordflow">else</font>
00431     dbus_error_free (&amp;error);
00432   
00433   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:bar=foo;baz"</font>, &amp;entries, &amp;len, &amp;error))
00434     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00435   <font class="keywordflow">else</font>
00436     dbus_error_free (&amp;error);
00437   
00438   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:=foo"</font>, &amp;entries, &amp;len, &amp;error))
00439     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00440   <font class="keywordflow">else</font>
00441     dbus_error_free (&amp;error);
00442   
00443   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:foo="</font>, &amp;entries, &amp;len, &amp;error))
00444     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00445   <font class="keywordflow">else</font>
00446     dbus_error_free (&amp;error);
00447 
00448   <font class="keywordflow">if</font> (dbus_parse_address (<font class="stringliteral">"foo:foo,bar=baz"</font>, &amp;entries, &amp;len, &amp;error))
00449     _dbus_assert_not_reached (<font class="stringliteral">"Parsed incorrect address."</font>);
00450   <font class="keywordflow">else</font>
00451     dbus_error_free (&amp;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>