2003-03-31 Havoc Pennington <hp@redhat.com>
[platform/upstream/dbus.git] / dbus / dbus-address.c
index 4c584bc..d309922 100644 (file)
@@ -27,9 +27,9 @@
 #include "dbus-list.h"
 
 /**
- * @defgroup DBusAddress address parsing
+ * @defgroup DBusAddress Address parsing
  * @ingroup  DBus
- * @brief Parsing addresses to DBus servers.
+ * @brief Parsing addresses of D-BUS servers.
  *
  * @{
  */
@@ -56,7 +56,8 @@ dbus_address_entry_free (DBusAddressEntry *entry)
       
       link = _dbus_list_get_next_link (&entry->keys, link);
     }
-
+  _dbus_list_clear (&entry->keys);
+  
   link = _dbus_list_get_first_link (&entry->values);
   while (link != NULL)
     {
@@ -65,6 +66,7 @@ dbus_address_entry_free (DBusAddressEntry *entry)
       
       link = _dbus_list_get_next_link (&entry->values, link);
     }
+  _dbus_list_clear (&entry->values);
   
   dbus_free (entry);
 }
@@ -73,8 +75,6 @@ dbus_address_entry_free (DBusAddressEntry *entry)
 /**
  * Frees a #NULL-terminated array of address entries.
  *
- * @todo dbus_address_entry_free() seems to leak list nodes
- * 
  * @param entries the array.
  */
 void
@@ -97,8 +97,11 @@ create_entry (void)
   if (entry == NULL)
     return NULL;
 
-  if (!_dbus_string_init (&entry->method, _DBUS_INT_MAX))
-    dbus_free (entry);
+  if (!_dbus_string_init (&entry->method))
+    {
+      dbus_free (entry);
+      return NULL;
+    }
 
   return entry;
 }
@@ -113,11 +116,7 @@ create_entry (void)
 const char *
 dbus_address_entry_get_method (DBusAddressEntry *entry)
 {
-  const char *method;
-
-  _dbus_string_get_const_data (&entry->method, &method);
-
-  return method;
+  return _dbus_string_get_const_data (&entry->method);
 }
 
 /**
@@ -141,12 +140,8 @@ dbus_address_entry_get_value (DBusAddressEntry *entry,
       _dbus_assert (values != NULL);
 
       if (_dbus_string_equal_c_str (keys->data, key))
-       {
-         const char *str;
+        return _dbus_string_get_const_data (values->data);
 
-         _dbus_string_get_const_data (values->data, &str);
-         return str;
-       }
       keys = _dbus_list_get_next_link (&entry->keys, keys);
       values = _dbus_list_get_next_link (&entry->values, values);
     }
@@ -167,20 +162,22 @@ dbus_address_entry_get_value (DBusAddressEntry *entry,
  * @param address the address.
  * @param entry return location to an array of entries.
  * @param array_len return location for array length.
- * @param result return location for result code.
+ * @param error address where an error can be returned.
  * @returns #TRUE on success, #FALSE otherwise.
  */
 dbus_bool_t
 dbus_parse_address (const char         *address,
                    DBusAddressEntry ***entry,
                    int                *array_len,
-                   DBusResultCode     *result)
+                    DBusError          *error)
 {
   DBusString str;
   int pos, end_pos, len, i;
   DBusList *entries, *link;
   DBusAddressEntry **entry_array;
 
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   _dbus_string_init_const (&str, address);
 
   entries = NULL;
@@ -196,7 +193,7 @@ dbus_parse_address (const char         *address,
       entry = create_entry ();
       if (!entry)
        {
-         dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
 
          goto error;
        }
@@ -204,7 +201,7 @@ dbus_parse_address (const char         *address,
       /* Append the entry */
       if (!_dbus_list_append (&entries, entry))
        {
-         dbus_set_result (result, DBUS_RESULT_NO_MEMORY);        
+         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
          dbus_address_entry_free (entry);
          goto error;
        }
@@ -216,13 +213,13 @@ dbus_parse_address (const char         *address,
       /* Look for the colon : */
       if (!_dbus_string_find_to (&str, pos, end_pos, ":", &found_pos))
        {
-         dbus_set_result (result, DBUS_RESULT_BAD_ADDRESS);
+         dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS, "Address does not contain a colon");
          goto error;
        }
 
       if (!_dbus_string_copy_len (&str, pos, found_pos - pos, &entry->method, 0))
        {
-         dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
          goto error;
        }
          
@@ -238,8 +235,9 @@ dbus_parse_address (const char         *address,
          if (!_dbus_string_find (&str, pos, "=", &equals_pos) ||
              equals_pos == pos || equals_pos + 1 == end_pos)
            {
-             dbus_set_result (result, DBUS_RESULT_BAD_ADDRESS);
-             goto error;
+             dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS,
+                              "'=' character not found or has no value following it");
+              goto error;
            }
          else
            {
@@ -250,30 +248,30 @@ dbus_parse_address (const char         *address,
 
              if (!key)
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);                
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);             
                  goto error;
                }
 
              value = dbus_new0 (DBusString, 1);
              if (!value)
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
                  dbus_free (key);
                  goto error;
                }
              
-             if (!_dbus_string_init (key, _DBUS_INT_MAX))
+             if (!_dbus_string_init (key))
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
                  dbus_free (key);
                  dbus_free (value);
                  
                  goto error;
                }
              
-             if (!_dbus_string_init (value, _DBUS_INT_MAX))
+             if (!_dbus_string_init (value))
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
                  _dbus_string_free (key);
 
                  dbus_free (key);
@@ -283,7 +281,7 @@ dbus_parse_address (const char         *address,
 
              if (!_dbus_string_copy_len (&str, pos, equals_pos - pos, key, 0))
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
                  _dbus_string_free (key);
                  _dbus_string_free (value);
 
@@ -294,7 +292,7 @@ dbus_parse_address (const char         *address,
 
              if (!_dbus_string_copy_len (&str, equals_pos + 1, comma_pos - equals_pos - 1, value, 0))
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);                
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);             
                  _dbus_string_free (key);
                  _dbus_string_free (value);
 
@@ -305,7 +303,7 @@ dbus_parse_address (const char         *address,
 
              if (!_dbus_list_append (&entry->keys, key))
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);                
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);             
                  _dbus_string_free (key);
                  _dbus_string_free (value);
 
@@ -316,7 +314,7 @@ dbus_parse_address (const char         *address,
 
              if (!_dbus_list_append (&entry->values, value))
                {
-                 dbus_set_result (result, DBUS_RESULT_NO_MEMORY);                
+                 dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);             
                  _dbus_string_free (value);
 
                  dbus_free (value);
@@ -336,7 +334,7 @@ dbus_parse_address (const char         *address,
 
   if (!entry_array)
     {
-      dbus_set_result (result, DBUS_RESULT_NO_MEMORY);
+      dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
       
       goto error;
     }
@@ -355,7 +353,6 @@ dbus_parse_address (const char         *address,
   _dbus_list_clear (&entries);
   *entry = entry_array;
 
-  dbus_set_result (result, DBUS_RESULT_SUCCESS);
   return TRUE;
 
  error:
@@ -367,6 +364,8 @@ dbus_parse_address (const char         *address,
       link = _dbus_list_get_next_link (&entries, link);
     }
 
+  _dbus_list_clear (&entries);
+  
   return FALSE;
   
 }
@@ -382,10 +381,12 @@ _dbus_address_test (void)
 {
   DBusAddressEntry **entries;
   int len;  
-  DBusResultCode result;
+  DBusError error;
 
+  dbus_error_init (&error);
+  
   if (!dbus_parse_address ("unix:path=/tmp/foo;debug:name=test,sliff=sloff;",
-                          &entries, &len, &result))
+                          &entries, &len, &error))
     _dbus_assert_not_reached ("could not parse address");
   _dbus_assert (len == 2);
   _dbus_assert (strcmp (dbus_address_entry_get_value (entries[0], "path"), "/tmp/foo") == 0);
@@ -395,26 +396,40 @@ _dbus_address_test (void)
   dbus_address_entries_free (entries);
 
   /* Different possible errors */
-  if (dbus_parse_address ("foo", &entries, &len, &result))
+  if (dbus_parse_address ("foo", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
-
-  if (dbus_parse_address ("foo:bar", &entries, &len, &result))
+  else
+    dbus_error_free (&error);
+  
+  if (dbus_parse_address ("foo:bar", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
-
-  if (dbus_parse_address ("foo:bar,baz", &entries, &len, &result))
+  else
+    dbus_error_free (&error);
+  
+  if (dbus_parse_address ("foo:bar,baz", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
-
-  if (dbus_parse_address ("foo:bar=foo,baz", &entries, &len, &result))
+  else
+    dbus_error_free (&error);
+  
+  if (dbus_parse_address ("foo:bar=foo,baz", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
-
-  if (dbus_parse_address ("foo:bar=foo;baz", &entries, &len, &result))
+  else
+    dbus_error_free (&error);
+  
+  if (dbus_parse_address ("foo:bar=foo;baz", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
-
-  if (dbus_parse_address ("foo:=foo", &entries, &len, &result))
+  else
+    dbus_error_free (&error);
+  
+  if (dbus_parse_address ("foo:=foo", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
-
-  if (dbus_parse_address ("foo:foo=", &entries, &len, &result))
+  else
+    dbus_error_free (&error);
+  
+  if (dbus_parse_address ("foo:foo=", &entries, &len, &error))
     _dbus_assert_not_reached ("Parsed incorrect address.");
+  else
+    dbus_error_free (&error);
   
   return TRUE;
 }