From e9763d92d475873139d12963daca012ab9961fbb Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Thu, 2 Dec 2010 08:34:07 +0000 Subject: [PATCH] add global version to cache files SVN revision: 55145 --- .../src/bin/efreet_desktop_cache_create.c | 7 ++ .../efreet/src/bin/efreet_icon_cache_create.c | 51 +++++----- legacy/efreet/src/lib/efreet_cache.c | 94 ++++++++++++++----- legacy/efreet/src/lib/efreet_cache_private.h | 9 ++ legacy/efreet/src/lib/efreet_private.h | 26 +++-- legacy/efreet/src/lib/efreet_utils.c | 36 +++---- 6 files changed, 134 insertions(+), 89 deletions(-) diff --git a/legacy/efreet/src/bin/efreet_desktop_cache_create.c b/legacy/efreet/src/bin/efreet_desktop_cache_create.c index b3c4598c4f..6623533f4b 100644 --- a/legacy/efreet/src/bin/efreet_desktop_cache_create.c +++ b/legacy/efreet/src/bin/efreet_desktop_cache_create.c @@ -233,6 +233,7 @@ main(int argc, char **argv) * during whilst this program runs. * - Maybe linger for a while to reduce number of cache re-creates. */ + Efreet_Cache_Version version; Eina_List *dirs = NULL, *user_dirs = NULL; int priority = 0; char *dir = NULL; @@ -404,6 +405,12 @@ main(int argc, char **argv) } /* cleanup */ + version.major = EFREET_DESKTOP_UTILS_CACHE_MAJOR; + version.minor = EFREET_DESKTOP_UTILS_CACHE_MINOR; + eet_data_write(util_ef, efreet_version_edd(), EFREET_CACHE_VERSION, &version, 1); + version.major = EFREET_DESKTOP_CACHE_MAJOR; + version.minor = EFREET_DESKTOP_CACHE_MINOR; + eet_data_write(ef, efreet_version_edd(), EFREET_CACHE_VERSION, &version, 1); eet_close(util_ef); eet_close(ef); diff --git a/legacy/efreet/src/bin/efreet_icon_cache_create.c b/legacy/efreet/src/bin/efreet_icon_cache_create.c index 026d4aa539..31d563cbeb 100644 --- a/legacy/efreet/src/bin/efreet_icon_cache_create.c +++ b/legacy/efreet/src/bin/efreet_icon_cache_create.c @@ -358,6 +358,7 @@ main(int argc, char **argv) * - pass extra dirs to binary, and read them * - make sure programs with different extra dirs all work together */ + Efreet_Cache_Version *version; Efreet_Cache_Theme *cache; Efreet_Icon_Theme *theme; Eet_Data_Descriptor *edd; @@ -425,6 +426,25 @@ main(int argc, char **argv) ef = eet_open(efreet_icon_cache_file(), EET_FILE_MODE_READ_WRITE); if (!ef) goto on_error_efreet; + version = eet_data_read(ef, efreet_version_edd(), EFREET_CACHE_VERSION); + if (version && + ((version->major != EFREET_ICON_CACHE_MAJOR) || + (version->minor != EFREET_ICON_CACHE_MINOR))) + { + // delete old cache + eet_close(ef); + if (unlink(efreet_icon_cache_file()) < 0) + { + if (errno != ENOENT) goto on_error_efreet; + } + ef = eet_open(efreet_icon_cache_file(), EET_FILE_MODE_READ_WRITE); + if (!ef) goto on_error_efreet; + } + if (!version) + version = NEW(Efreet_Cache_Version, 1); + + version->major = EFREET_ICON_CACHE_MAJOR; + version->minor = EFREET_ICON_CACHE_MINOR; edd = efreet_icon_theme_edd(EINA_TRUE); @@ -437,26 +457,12 @@ main(int argc, char **argv) /* read icons from the eet file */ cache = eet_data_read(ef, edd, theme->name.internal); - /* Wype out in case of version change */ - if (cache && - (cache->version.major != EFREET_CACHE_MAJOR - || cache->version.minor != EFREET_CACHE_MINOR)) - { - eina_hash_free(cache->icons); - eina_hash_free(cache->dirs); - free(cache); - cache = NULL; - } - /* No existing cache before, so create it */ if (!cache) { cache = NEW(Efreet_Cache_Theme, 1); if (!cache) goto on_error_efreet; - cache->version.major = EFREET_CACHE_MAJOR; - cache->version.minor = EFREET_CACHE_MINOR; - changed = EINA_TRUE; } @@ -486,16 +492,7 @@ main(int argc, char **argv) edd = efreet_icon_fallback_edd(EINA_TRUE); /* read fallback icons from the eet file */ - cache = eet_data_read(ef, edd, "efreet/fallback"); - if (cache && - (cache->version.major != EFREET_CACHE_MAJOR - || cache->version.minor != EFREET_CACHE_MINOR)) - { - if (cache->icons) eina_hash_free(cache->icons); - if (cache->dirs) eina_hash_free(cache->dirs); - free(cache); - cache = NULL; - } + cache = eet_data_read(ef, edd, EFREET_CACHE_ICON_FALLBACK); /* No existing fallback, create it */ if (!cache) @@ -503,9 +500,6 @@ main(int argc, char **argv) cache = NEW(Efreet_Cache_Theme, 1); if (!cache) goto on_error_efreet; - cache->version.major = EFREET_CACHE_MAJOR; - cache->version.minor = EFREET_CACHE_MINOR; - changed = EINA_TRUE; } @@ -520,7 +514,7 @@ main(int argc, char **argv) { fprintf(stderr, "generated: fallback %i (%i)\n", changed, eina_hash_population(cache->icons)); if (changed) - eet_data_write(ef, edd, "efreet/fallback", cache, 1); + eet_data_write(ef, edd, EFREET_CACHE_ICON_FALLBACK, cache, 1); } eina_hash_free(cache->icons); @@ -528,6 +522,7 @@ main(int argc, char **argv) free(cache); /* save data */ + eet_data_write(ef, efreet_version_edd(), EFREET_CACHE_VERSION, version, 1); eet_close(ef); /* touch update file */ diff --git a/legacy/efreet/src/lib/efreet_cache.c b/legacy/efreet/src/lib/efreet_cache.c index cdc36414ef..b95cae8830 100644 --- a/legacy/efreet/src/lib/efreet_cache.c +++ b/legacy/efreet/src/lib/efreet_cache.c @@ -33,6 +33,7 @@ static int _efreet_cache_log_dom = -1; * Data for cache files */ #ifdef ICON_CACHE +static Eet_Data_Descriptor *cache_version_edd = NULL; static Eet_Data_Descriptor *directory_edd = NULL; static Eet_Data_Descriptor *cache_theme_edd = NULL; static Eet_Data_Descriptor *cache_fallback_edd = NULL; @@ -142,12 +143,10 @@ efreet_cache_shutdown(void) if (theme_name) eina_stringshare_del(theme_name); theme_name = NULL; - if (cache) eet_close(cache); - cache = NULL; + cache = efreet_cache_close(cache); #endif - if (desktop_cache) eet_close(desktop_cache); - desktop_cache = NULL; + desktop_cache = efreet_cache_close(desktop_cache); IF_RELEASE(desktop_cache_file); IF_RELEASE(desktop_cache_dirs); @@ -257,6 +256,7 @@ Edd = NULL; static void efreet_cache_edd_shutdown(void) { + EDD_SHUTDOWN(cache_version_edd); EDD_SHUTDOWN(desktop_edd); #ifdef ICON_CACHE EDD_SHUTDOWN(cache_fallback_edd); @@ -326,6 +326,28 @@ efreet_icon_directory_edd(void) return directory_edd; } +/* + * Needs EAPI because of helper binaries + */ +EAPI Eet_Data_Descriptor * +efreet_version_edd(void) +{ + Eet_Data_Descriptor_Class eddc; + + if (cache_version_edd) return cache_version_edd; + + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Version); + cache_version_edd = eet_data_descriptor_file_new(&eddc); + if (!cache_version_edd) return NULL; + + EET_DATA_DESCRIPTOR_ADD_BASIC(cache_version_edd, Efreet_Cache_Version, + "minor", minor, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(cache_version_edd, Efreet_Cache_Version, + "major", major, EET_T_UCHAR); + + return cache_version_edd; +} + /* * Needs EAPI because of helper binaries */ @@ -369,10 +391,6 @@ efreet_icon_theme_edd(Eina_Bool include_dirs) cache_theme_edd = eet_data_descriptor_file_new(&eddc); if (!cache_theme_edd) return NULL; - EET_DATA_DESCRIPTOR_ADD_BASIC(cache_theme_edd, Efreet_Cache_Theme, - "version.minor", version.minor, EET_T_UCHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(cache_theme_edd, Efreet_Cache_Theme, - "version.major", version.major, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_HASH(cache_theme_edd, Efreet_Cache_Theme, "icons", icons, icon_edd); @@ -419,10 +437,6 @@ efreet_icon_fallback_edd(Eina_Bool include_dirs) cache_fallback_edd = eet_data_descriptor_file_new(&eddc); if (!cache_fallback_edd) return NULL; - EET_DATA_DESCRIPTOR_ADD_BASIC(cache_fallback_edd, Efreet_Cache_Theme, - "version.minor", version.minor, EET_T_UCHAR); - EET_DATA_DESCRIPTOR_ADD_BASIC(cache_fallback_edd, Efreet_Cache_Theme, - "version.major", version.major, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_HASH(cache_fallback_edd, Efreet_Cache_Theme, "icons", icons, icon_fallback_edd); @@ -507,8 +521,7 @@ efreet_cache_icon_fallback_free(Efreet_Cache_Fallback_Icon *icon) Efreet_Cache_Icon * efreet_cache_icon_find(Efreet_Icon_Theme *theme, const char *icon) { - if (!cache) cache = eet_open(efreet_icon_cache_file(), EET_FILE_MODE_READ); - if (!cache) return NULL; + if (!efreet_cache_check(&cache, efreet_icon_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL; if (theme_name && strcmp(theme_name, theme->name.internal)) { @@ -529,7 +542,7 @@ efreet_cache_icon_find(Efreet_Icon_Theme *theme, const char *icon) theme_name = eina_stringshare_add(theme->name.internal); } - if (!theme_cache || theme_cache->version.major != EFREET_CACHE_MAJOR) return NULL; + if (!theme_cache) return NULL; return eina_hash_find(theme_cache->icons, icon); } @@ -537,18 +550,17 @@ efreet_cache_icon_find(Efreet_Icon_Theme *theme, const char *icon) Efreet_Cache_Fallback_Icon * efreet_cache_icon_fallback_find(const char *icon) { - if (!cache) cache = eet_open(efreet_icon_cache_file(), EET_FILE_MODE_READ); - if (!cache) return NULL; + if (!efreet_cache_check(&cache, efreet_icon_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL; if (!fallback_cache) { INFO("loading fallback cache"); - fallback_cache = eet_data_read(cache, efreet_icon_fallback_edd(EINA_FALSE), "efreet/fallback"); + fallback_cache = eet_data_read(cache, efreet_icon_fallback_edd(EINA_FALSE), EFREET_CACHE_ICON_FALLBACK); if (fallback_cache && !fallback_cache->icons) fallback_cache->icons = eina_hash_string_superfast_new((Eina_Free_Cb) efreet_cache_icon_fallback_free); } - if (!fallback_cache || fallback_cache->version.major != EFREET_CACHE_MAJOR) return NULL; + if (!fallback_cache) return NULL; return eina_hash_find(fallback_cache->icons, icon); } @@ -562,10 +574,7 @@ efreet_cache_desktop_find(const char *file) if (!realpath(file, rp)) return NULL; - if (!desktop_cache) - desktop_cache = eet_open(efreet_desktop_cache_file(), EET_FILE_MODE_READ); - if (!desktop_cache) - return NULL; + if (!efreet_cache_check(&desktop_cache, efreet_desktop_cache_file(), EFREET_DESKTOP_CACHE_MAJOR)) return NULL; desktop = eet_data_read(desktop_cache, efreet_desktop_edd(), rp); if (!desktop) return NULL; @@ -621,6 +630,40 @@ efreet_cache_desktop_free(Efreet_Desktop *desktop) } } +Eina_Bool +efreet_cache_check(Eet_File **ef, const char *path, int major) +{ + Efreet_Cache_Version *version; + + if (*ef == NON_EXISTING) return EINA_FALSE; + if (!*ef) + *ef = eet_open(path, EET_FILE_MODE_READ); + if (!*ef) + { + *ef = NON_EXISTING; + return EINA_FALSE; + } + + version = eet_data_read(*ef, efreet_version_edd(), EFREET_CACHE_VERSION); + if ((!version) || (version->major != major)) + { + IF_FREE(version); + eet_close(*ef); + *ef = NON_EXISTING; + return EINA_FALSE; + } + free(version); + return EINA_TRUE; +} + +void * +efreet_cache_close(Eet_File *ef) +{ + if (ef && ef != NON_EXISTING) + eet_close(ef); + return NULL; +} + static Eina_Bool cache_exe_cb(void *data __UNUSED__, int type __UNUSED__, void *event) { @@ -698,8 +741,7 @@ cache_update_cb(void *data __UNUSED__, Ecore_File_Monitor *em __UNUSED__, fallback_cache = _efreet_cache_free(fallback_cache); } - if (cache) eet_close(cache); - cache = NULL; + cache = efreet_cache_close(cache); ev = NEW(Efreet_Event_Cache_Update, 1); if (!ev) return; @@ -821,7 +863,7 @@ desktop_cache_update_free(void *data, void *ev) */ if (dangling == 0) { - if (d->ef) eet_close(d->ef); + efreet_cache_close(d->ef); } else { diff --git a/legacy/efreet/src/lib/efreet_cache_private.h b/legacy/efreet/src/lib/efreet_cache_private.h index a3e1f59301..34a365a3c4 100644 --- a/legacy/efreet/src/lib/efreet_cache_private.h +++ b/legacy/efreet/src/lib/efreet_cache_private.h @@ -1,6 +1,15 @@ #ifndef EFREET_CACHE_PRIVATE_H #define EFREET_CACHE_PRIVATE_H +#define EFREET_CACHE_VERSION "efreet//version" +#ifdef ICON_CACHE +#define EFREET_CACHE_ICON_FALLBACK "efreet//fallback" +#endif + +Eina_Bool efreet_cache_check(Eet_File **ef, const char *path, int major); +void *efreet_cache_close(Eet_File *ef); + +EAPI Eet_Data_Descriptor *efreet_version_edd(void); EAPI Eet_Data_Descriptor *efreet_desktop_edd(void); #ifdef ICON_CACHE EAPI Eet_Data_Descriptor *efreet_icon_theme_edd(Eina_Bool include_dirs); diff --git a/legacy/efreet/src/lib/efreet_private.h b/legacy/efreet/src/lib/efreet_private.h index ac0b1345b5..a679825d06 100644 --- a/legacy/efreet/src/lib/efreet_private.h +++ b/legacy/efreet/src/lib/efreet_private.h @@ -116,22 +116,28 @@ extern int _efreet_log_dom_global; extern Eina_Hash *efreet_desktop_cache; #ifdef ICON_CACHE -#define EFREET_CACHE_MAJOR 0 -#define EFREET_CACHE_MINOR 3 +#define EFREET_ICON_CACHE_MAJOR 0 +#define EFREET_ICON_CACHE_MINOR 4 +#define EFREET_DESKTOP_CACHE_MAJOR 0 +#define EFREET_DESKTOP_CACHE_MINOR 1 +#define EFREET_DESKTOP_UTILS_CACHE_MAJOR 0 +#define EFREET_DESKTOP_UTILS_CACHE_MINOR 1 -typedef struct _Efreet_Cache_Icon_Element Efreet_Cache_Icon_Element; -typedef struct _Efreet_Cache_Fallback_Icon Efreet_Cache_Fallback_Icon; -typedef struct _Efreet_Cache_Icon Efreet_Cache_Icon; +typedef struct _Efreet_Cache_Version Efreet_Cache_Version; typedef struct _Efreet_Cache_Theme Efreet_Cache_Theme; typedef struct _Efreet_Cache_Directory Efreet_Cache_Directory; +typedef struct _Efreet_Cache_Icon Efreet_Cache_Icon; +typedef struct _Efreet_Cache_Icon_Element Efreet_Cache_Icon_Element; +typedef struct _Efreet_Cache_Fallback_Icon Efreet_Cache_Fallback_Icon; + +struct _Efreet_Cache_Version +{ + unsigned char major; + unsigned char minor; +}; struct _Efreet_Cache_Theme { - struct { - unsigned char major; - unsigned char minor; - } version; - Eina_Hash *icons; Eina_Hash *dirs; }; diff --git a/legacy/efreet/src/lib/efreet_utils.c b/legacy/efreet/src/lib/efreet_utils.c index b400f6432a..51b1a7c534 100644 --- a/legacy/efreet/src/lib/efreet_utils.c +++ b/legacy/efreet/src/lib/efreet_utils.c @@ -2,6 +2,8 @@ # include #endif +/* TODO: move eet file handling to eet_cache.c */ + #undef alloca #ifdef HAVE_ALLOCA_H # include @@ -32,6 +34,7 @@ void *alloca (size_t); #include "Efreet.h" #include "efreet_private.h" +#include "efreet_cache_private.h" /* define macros and variable for using the eina logging system */ @@ -51,8 +54,6 @@ static Efreet_Desktop *efreet_util_cache_find(const char *search, const char *wh static Eina_List *efreet_util_cache_list(const char *search, const char *what); static Eina_List *efreet_util_cache_glob_list(const char *search, const char *what); -static Eina_Bool cache_check(void); - static Eina_Hash *file_id_by_desktop_path = NULL; static const char *cache_file = NULL; static Eet_File *cache = NULL; @@ -83,7 +84,7 @@ efreet_util_shutdown(void) eina_log_domain_unregister(_efreet_utils_log_dom); IF_FREE_HASH(file_id_by_desktop_path); - if (cache) eet_close(cache); + cache = efreet_cache_close(cache); IF_RELEASE(cache_file); return init; } @@ -238,7 +239,7 @@ efreet_util_desktop_exec_find(const char *exec) int num, i; Efreet_Desktop *ret = NULL; - if (!cache_check()) return NULL; + if (!efreet_cache_check(&cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL; if (!exec) return NULL; keys = eet_list(cache, "*::e", &num); @@ -331,7 +332,7 @@ efreet_util_desktop_exec_glob_list(const char *glob) int num, i; Eina_List *ret = NULL; - if (!cache_check()) return NULL; + if (!efreet_cache_check(&cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL; if (!glob) return NULL; keys = eet_list(cache, "*::e", &num); @@ -408,7 +409,7 @@ efreet_util_desktop_categories_list(void) int num, i; Eina_List *ret = NULL; - if (!cache_check()) return NULL; + if (!efreet_cache_check(&cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL; keys = eet_list(cache, "*::ca", &num); if (!keys) return NULL; for (i = 0; i < num; i++) @@ -506,7 +507,7 @@ efreet_util_cache_find(const char *search, const char *what1, const char *what2) int num, i; Efreet_Desktop *ret = NULL; - if (!cache_check()) return NULL; + if (!efreet_cache_check(&cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL; if ((!what1) && (!what2)) return NULL; keys = eet_list(cache, search, &num); @@ -540,7 +541,7 @@ efreet_util_cache_list(const char *search, const char *what) int num, i; Eina_List *ret = NULL; - if (!cache_check()) return NULL; + if (!efreet_cache_check(&cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL; if (!what) return NULL; keys = eet_list(cache, search, &num); @@ -575,7 +576,7 @@ efreet_util_cache_glob_list(const char *search, const char *what) int num, i; Eina_List *ret = NULL; - if (!cache_check()) return NULL; + if (!efreet_cache_check(&cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL; if (!what) return NULL; keys = eet_list(cache, search, &num); @@ -606,20 +607,5 @@ efreet_util_cache_glob_list(const char *search, const char *what) void efreet_util_desktop_cache_reload(void) { - if (cache && cache != NON_EXISTING) eet_close(cache); - cache = NULL; -} - -static Eina_Bool -cache_check(void) -{ - if (cache == NON_EXISTING) return EINA_FALSE; - if (!cache) - cache = eet_open(efreet_desktop_util_cache_file(), EET_FILE_MODE_READ); - if (!cache) - { - cache = NON_EXISTING; - return EINA_FALSE; - } - return EINA_TRUE; + cache = efreet_cache_close(cache); }