Don't reallocate the Efreet_Desktop on re-read

SVN revision: 29204
This commit is contained in:
Sebastian Dransfeld 2007-03-27 19:41:23 +00:00
parent af731bf780
commit 0c5a7e8872
1 changed files with 67 additions and 11 deletions

View File

@ -46,6 +46,8 @@ struct Efreet_Desktop_Type_Info
};
static Efreet_Desktop *efreet_desktop_new(const char *file);
static int efreet_desktop_read(Efreet_Desktop *desktop);
static void efreet_desktop_clear(Efreet_Desktop *desktop);
static Efreet_Desktop_Type_Info *efreet_desktop_type_parse(const char *type_str);
static Ecore_List *efreet_desktop_string_list_parse(const char *string);
static char *efreet_desktop_string_list_join(Ecore_List *list);
@ -193,6 +195,10 @@ efreet_desktop_get(const char *file)
if (efreet_desktop_cache_check(desktop))
return desktop;
efreet_desktop_clear(desktop);
if (efreet_desktop_read(desktop))
return desktop;
ecore_hash_remove(efreet_desktop_cache, file);
efreet_desktop_free(desktop);
}
@ -235,9 +241,6 @@ static Efreet_Desktop *
efreet_desktop_new(const char *file)
{
Efreet_Desktop *desktop;
Efreet_Ini *ini;
int error = 0;
int ok;
desktop = NEW(Efreet_Desktop, 1);
if (!desktop) return NULL;
@ -245,13 +248,32 @@ efreet_desktop_new(const char *file)
desktop->orig_path = strdup(file);
desktop->load_time = ecore_time_get();
ini = efreet_ini_new(file);
if (!efreet_desktop_read(desktop))
{
efreet_desktop_free(desktop);
return NULL;
}
return desktop;
}
/**
* @internal
* @param desktop: The desktop to fill
* @return Returns 1 on success, 0 on failure
* @brief initialize an Efreet_Desktop from the contents of @a file
*/
static int
efreet_desktop_read(Efreet_Desktop *desktop)
{
Efreet_Ini *ini;
int error = 0;
int ok;
ini = efreet_ini_new(desktop->orig_path);
if (!ini->data)
{
efreet_ini_free(ini);
IF_FREE(desktop->orig_path);
free(desktop);
return NULL;
return 0;
}
ok = efreet_ini_section_set(ini, "Desktop Entry");
@ -287,11 +309,45 @@ efreet_desktop_new(const char *file)
efreet_ini_free(ini);
if (!error)
return desktop;
if (error) return 0;
efreet_desktop_free(desktop);
return NULL;
return 1;
}
/**
* @internal
* @param desktop: The Efreet_Desktop to work with
* @return Returns no value
* @brief Frees the Efreet_Desktop's data
*/
static void
efreet_desktop_clear(Efreet_Desktop *desktop)
{
IF_FREE(desktop->name);
IF_FREE(desktop->generic_name);
IF_FREE(desktop->comment);
IF_FREE(desktop->icon);
IF_FREE(desktop->url);
IF_FREE(desktop->try_exec);
IF_FREE(desktop->exec);
IF_FREE(desktop->path);
IF_FREE(desktop->startup_wm_class);
IF_FREE_LIST(desktop->only_show_in);
IF_FREE_LIST(desktop->not_show_in);
IF_FREE_LIST(desktop->categories);
IF_FREE_LIST(desktop->mime_types);
IF_FREE_HASH(desktop->x);
if (desktop->type_data)
{
Efreet_Desktop_Type_Info *info;
info = ecore_list_goto_index(efreet_desktop_types, desktop->type);
if (info->free_func)
info->free_func(desktop->type_data);
}
}
/**