Enlightenment CVS committal Author : sebastid Project : e17 Module : libs/ecore
Dir : e17/libs/ecore/src/lib/ecore_desktop Modified Files: ecore_desktop_icon.c Log Message: Bail early on error. =================================================================== RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_desktop/ecore_desktop_icon.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -3 -r1.26 -r1.27 --- ecore_desktop_icon.c 23 Sep 2006 08:49:31 -0000 1.26 +++ ecore_desktop_icon.c 23 Sep 2006 09:07:35 -0000 1.27 @@ -354,8 +354,7 @@ { ecore_hash_set_free_key(icon_theme_cache, free); ecore_hash_set_free_value(icon_theme_cache, - (Ecore_Free_Cb) - _ecore_desktop_icon_theme_destroy); + ECORE_FREE_CB(_ecore_desktop_icon_theme_destroy)); } } @@ -406,6 +405,9 @@ { Ecore_Desktop_Icon_Theme *result; char *theme_path = NULL, *dir = NULL; + char *value; + Ecore_List *Directories; + char *directory; if (icon_theme[0] == '/') { @@ -418,189 +420,118 @@ #endif } - result = - (Ecore_Desktop_Icon_Theme *) ecore_hash_get(icon_theme_cache, - (char *)icon_theme); - if (!result) + result = ecore_hash_get(icon_theme_cache, icon_theme); + if (result) goto done; + if (!dir) { + char icn[PATH_MAX]; - if (!dir) - { - char icn[PATH_MAX]; - - snprintf(icn, PATH_MAX, "%s/index.theme", icon_theme); + snprintf(icn, PATH_MAX, "%s/index.theme", icon_theme); #ifdef DEBUG - printf("SEARCHING FOR %s\n", icn); + printf("SEARCHING FOR %s\n", icn); #endif - theme_path = - ecore_desktop_paths_file_find(ecore_desktop_paths_icons, icn, 2, - NULL, NULL); - } - if (theme_path) + theme_path = ecore_desktop_paths_file_find(ecore_desktop_paths_icons, icn, + 2, NULL, NULL); + } + if (!theme_path) goto error; + result = calloc(1, sizeof(Ecore_Desktop_Icon_Theme)); + if (!result) goto error; + result->data = ecore_desktop_ini_get(theme_path); + if (!result->data) goto error; + result->group = ecore_hash_get(result->data, "Icon Theme"); + if (!result->group) goto error; + + /* According to the spec, name and comment are required, but we can fake those easily enough. */ + value = ecore_hash_get(result->group, "Name"); + if (!value) value = icon_theme; + result->name = strdup(value); + value = ecore_hash_get(result->group, "Comment"); + if (!value) value = "No comment provided."; + result->comment = strdup(value); + value = ecore_hash_get(result->group, "Inherits"); + if (value) + { + result->inherits = strdup(value); + if (result->inherits) + result->Inherits = ecore_desktop_paths_to_list(result->inherits); + } + value = ecore_hash_get(result->group, "Example"); + if (!value) value = "exec"; + result->example = strdup(value); + value = ecore_hash_get(result->group, "Directories"); + /* FIXME: Directories is also required, don't feel like faking it for now. */ + if (!value) goto error; + result->directories = strdup(value); + Directories = ecore_desktop_paths_to_list(result->directories); + if (!Directories) goto error; + result->Directories = ecore_list_new(); + if (!result->Directories) goto error; + ecore_list_set_free_cb(result->Directories, + ECORE_FREE_CB(_ecore_desktop_icon_theme_directory_destroy)); + ecore_list_goto_first(Directories); + while ((directory = ecore_list_next(Directories)) != NULL) + { + Ecore_Hash *sub_group; + Ecore_Desktop_Icon_Theme_Directory *dir; + + /* Get the details for this theme directory. */ + sub_group = ecore_hash_get(result->data, directory); + dir = calloc(1, sizeof (Ecore_Desktop_Icon_Theme_Directory)); + if ((dir) && (sub_group)) { - result = calloc(1, sizeof(Ecore_Desktop_Icon_Theme)); - if (result) + char *size, *minsize, *maxsize, *threshold; + + dir->path = strdup(directory); + value = ecore_hash_get(sub_group, "Type"); + if (!value) + value = "Threshold"; + dir->type = strdup(value); + size = ecore_hash_get(sub_group, "Size"); + minsize = ecore_hash_get(sub_group, "MinSize"); + maxsize = ecore_hash_get(sub_group, "MaxSize"); + threshold = ecore_hash_get(sub_group, "Threshold"); + if (size) { - result->data = ecore_desktop_ini_get(theme_path); - if (result->data) - { - result->group = - (Ecore_Hash *) ecore_hash_get(result->data, - "Icon Theme"); - if (result->group) - { - char *value; - - /* According to the spec, name and comment are required, but we can fake those easily enough. */ - value = - (char *)ecore_hash_get(result->group, "Name"); - if (!value) - value = (char *)icon_theme; - result->name = strdup(value); - value = - (char *)ecore_hash_get(result->group, "Comment"); - if (!value) - value = "No comment provided."; - result->comment = strdup(value); - value = - (char *)ecore_hash_get(result->group, "Inherits"); - if (value) - { - result->inherits = strdup(value); - if (result->inherits) - result->Inherits = ecore_desktop_paths_to_list(result->inherits); - } - value = - (char *)ecore_hash_get(result->group, "Example"); - if (!value) - value = "exec"; - result->example = strdup(value); - value = - (char *)ecore_hash_get(result->group, - "Directories"); - /* FIXME: Directories is also required, don't feel like faking it for now. */ - if (value) - { - Ecore_List *Directories; - - result->directories = strdup(value); - Directories = - ecore_desktop_paths_to_list(result-> - directories); - if (Directories) - { - char *directory; - - result->Directories = ecore_list_new(); - if (result->Directories) - { - ecore_list_set_free_cb(result-> - Directories, - (Ecore_Free_Cb) - _ecore_desktop_icon_theme_directory_destroy); - ecore_list_goto_first(Directories); - while ((directory = - ecore_list_next(Directories)) - != NULL) - { - Ecore_Hash *sub_group; - Ecore_Desktop_Icon_Theme_Directory - *dir; - - /* Get the details for this theme directory. */ - sub_group = - (Ecore_Hash *) - ecore_hash_get(result->data, - directory); - dir = - calloc(1, - sizeof - (Ecore_Desktop_Icon_Theme_Directory)); - if ((dir) && (sub_group)) - { - char *size, - *minsize, *maxsize, - *threshold; - - dir->path = - strdup(directory); - value = - (char *) - ecore_hash_get - (sub_group, "Type"); - if (!value) - value = "Threshold"; - dir->type = strdup(value); - size = - (char *) - ecore_hash_get - (sub_group, "Size"); - minsize = - (char *) - ecore_hash_get - (sub_group, "MinSize"); - maxsize = - (char *) - ecore_hash_get - (sub_group, "MaxSize"); - threshold = - (char *) - ecore_hash_get - (sub_group, - "Threshold"); - if (size) - { - if (!minsize) - minsize = size; - if (!maxsize) - maxsize = size; - if (!threshold) - threshold = "2"; - dir->minimum = - atoi(minsize); - dir->maximum = - atoi(maxsize); - dir->threshold = - atoi(threshold); - - dir->size = - atoi(size); - ecore_list_append - (result-> - Directories, dir); - } - else if (dir) - _ecore_desktop_icon_theme_directory_destroy - (dir); - } - else if (dir) - _ecore_desktop_icon_theme_directory_destroy - (dir); - } - } - } - - /* This passes the basic validation tests, mark it as real and cache it. */ - result->path = strdup(theme_path); - ecore_hash_set(icon_theme_cache, - strdup(icon_theme), result); - } - } - ecore_hash_destroy(result->data); - } - - if (!result->path) - { - _ecore_desktop_icon_theme_destroy(result); - result = NULL; - } + if (!minsize) + minsize = size; + if (!maxsize) + maxsize = size; + if (!threshold) + threshold = "2"; + dir->minimum = atoi(minsize); + dir->maximum = atoi(maxsize); + dir->threshold = atoi(threshold); + + dir->size = atoi(size); + ecore_list_append(result-> Directories, dir); } + else + _ecore_desktop_icon_theme_directory_destroy(dir); } + else if (dir) + _ecore_desktop_icon_theme_directory_destroy(dir); } - if (dir) free(dir); - if (theme_path) free(theme_path); + + /* This passes the basic validation tests, mark it as real and cache it. */ + result->path = strdup(theme_path); + ecore_hash_set(icon_theme_cache, strdup(icon_theme), result); + ecore_hash_destroy(result->data); + +done: + if (dir) free(dir); + if (theme_path) free(theme_path); return result; + +error: + if (dir) free(dir); + if (theme_path) free(theme_path); + if (result) + { + _ecore_desktop_icon_theme_destroy(result); + if (result->data) ecore_hash_destroy(result->data); + } + return NULL; } /** ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs