add global version to cache files

SVN revision: 55145
This commit is contained in:
Sebastian Dransfeld 2010-12-02 08:34:07 +00:00
parent 0ccccf1934
commit e9763d92d4
6 changed files with 134 additions and 89 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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
{

View File

@ -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);

View File

@ -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;
};

View File

@ -2,6 +2,8 @@
# include <config.h>
#endif
/* TODO: move eet file handling to eet_cache.c */
#undef alloca
#ifdef HAVE_ALLOCA_H
# include <alloca.h>
@ -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);
}