These are all patches from Kjartan Maraas <kmaraas at gnome dot org>
[platform/upstream/dbus.git] / bus / desktop-file.c
index f45a997..7a96a44 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2003  CodeFactory AB
  * Copyright (C) 2003  Red Hat Inc.
  *
- * Licensed under the Academic Free License version 1.2
+ * Licensed under the Academic Free License version 2.1
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -48,15 +48,19 @@ struct BusDesktopFile
   int n_allocated_sections;
 };
 
+/**
+ * Parser for service files.
+ */
 typedef struct
 {
-  DBusString data;
+  DBusString data; /**< The data from the file */
 
-  BusDesktopFile *desktop_file;
-  int current_section;
+  BusDesktopFile *desktop_file; /**< The resulting object */
+  int current_section;    /**< The current section being parsed */
   
-  int pos, len;
-  int line_num;
+  int pos;          /**< Current position */
+  int len;          /**< Length */
+  int line_num;     /**< Current line number */
   
 } BusDesktopFileParser;
 
@@ -180,6 +184,8 @@ unescape_string (BusDesktopFileParser *parser,
                  DBusError            *error)
 {
   char *retval, *q;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   /* len + 1 is enough, because unescaping never makes the
    * string longer
@@ -389,6 +395,8 @@ parse_section_start (BusDesktopFileParser *parser, DBusError *error)
 {
   int line_end;
   char *section_name;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
     line_end = parser->len;
@@ -447,10 +455,12 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)
   char *value, *tmp;
   DBusString key;
   BusDesktopFileLine *line;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
     line_end = parser->len;
-
+  
   p = parser->pos;
   key_start = p;
   while (p < line_end &&
@@ -466,6 +476,17 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)
     }
 
   /* We ignore locales for now */
+  if (p < line_end && _dbus_string_get_byte (&parser->data, p) == '[')
+    {
+      if (line_end == parser->len)
+       parser->pos = parser->len;
+      else
+       parser->pos = line_end + 1;
+         
+      parser->line_num += 1;
+
+      return TRUE;
+    }
   
   /* Skip space before '=' */
   while (p < line_end && _dbus_string_get_byte (&parser->data, p) == ' ')
@@ -504,12 +525,14 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)
   line = new_line (parser);
   if (line == NULL)
     {
+      dbus_free (value);
       parser_free (parser);
       return FALSE;
     }
   
-  if (!_dbus_string_init (&key, key_end - key_start))
+  if (!_dbus_string_init (&key))
     {
+      dbus_free (value);
       parser_free (parser);
       return FALSE;
     }
@@ -517,12 +540,14 @@ parse_key_value (BusDesktopFileParser *parser, DBusError *error)
   if (!_dbus_string_copy_len (&parser->data, key_start, key_end - key_start,
                               &key, 0))
     {
+      dbus_free (value);
       parser_free (parser);
       return FALSE;
     }
   
   if (!_dbus_string_steal_data (&key, &tmp))
     {
+      dbus_free (value);
       parser_free (parser);
       return FALSE;
     }
@@ -549,7 +574,9 @@ report_error (BusDesktopFileParser *parser,
              DBusError            *error)
 {
   const char *section_name = NULL;
-    
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
+  
   if (parser->current_section != -1)
     section_name = parser->desktop_file->sections[parser->current_section].section_name;
 
@@ -589,6 +616,8 @@ bus_desktop_file_load (DBusString *filename,
   DBusString str;
   BusDesktopFileParser parser;
   DBusStat sb;
+
+  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
   /* Clearly there's a race here, but it's just to make it unlikely
    * that we do something silly, we still handle doing it below.
@@ -603,7 +632,7 @@ bus_desktop_file_load (DBusString *filename,
       return NULL;
     }
   
-  if (!_dbus_string_init (&str, _DBUS_INT_MAX))
+  if (!_dbus_string_init (&str))
     return NULL;
   
   if (!_dbus_file_get_contents (&str, filename, error))
@@ -633,14 +662,13 @@ bus_desktop_file_load (DBusString *filename,
   parser.pos = 0;
   parser.len = _dbus_string_get_length (&parser.data);
   parser.current_section = -1;
-  
+
   while (parser.pos < parser.len)
     {
       if (_dbus_string_get_byte (&parser.data, parser.pos) == '[')
        {
          if (!parse_section_start (&parser, error))
             {
-              _dbus_string_free (&parser.data);
               return NULL;
             }
        }
@@ -651,7 +679,6 @@ bus_desktop_file_load (DBusString *filename,
        {
          if (!parse_key_value (&parser, error))
             {
-              _dbus_string_free (&parser.data);
               return NULL;
             }
        }