Efreet: Flush cache if we add new extensions

SVN revision: 58043
This commit is contained in:
Sebastian Dransfeld 2011-03-23 20:02:46 +00:00
parent 84c7aaa3c8
commit 939470bd59
2 changed files with 97 additions and 9 deletions

View File

@ -648,6 +648,77 @@ icon_theme_free(Efreet_Cache_Icon_Theme *theme)
free(theme);
}
/**
* @internal
* @return EINA_TRUE if data adds new
*/
static Eina_Bool
add_data(Eet_File *ef, Eina_Array *data, const char *key)
{
Efreet_Cache_Array_String *add;
unsigned int i, j;
Eina_Bool added = EINA_FALSE;
add = eet_data_read(ef, efreet_array_string_edd(), key);
if (!add) return EINA_TRUE;
/* loop once to check added */
for (i = 0; i < data->count; i++)
{
int found = 0;
for (j = 0; j < add->array_count; ++j)
{
if (!strcmp(add->array[j], data->data[i]))
{
found = 1;
break;
}
}
if (!found)
{
added = EINA_TRUE;
break;
}
}
/* loop again to add all data */
for (i = 0; i < add->array_count; i++)
{
int found = 0;
for (j = 0; j < data->count; ++j)
{
if (!strcmp(add->array[i], data->data[j]))
{
found = 1;
break;
}
}
if (!found)
eina_array_push(data, add->array[i]);
}
IF_FREE(add->array);
free(add);
return added;
}
static void
save_data(Eet_File *ef, Eina_Array *data, const char *key)
{
Efreet_Cache_Array_String *save;
unsigned int i;
if (!data || !data->count) return;
save = NEW(Efreet_Cache_Array_String, 1);
save->array = NEW(char *, data->count);
save->array_count = 0;
for (i = 0; i < data->count; ++i)
save->array[save->array_count++] = data->data[i];
eet_data_write(ef, efreet_array_string_edd(), key, save, 1);
IF_FREE(save->array);
free(save);
}
int
main(int argc, char **argv)
{
@ -673,6 +744,7 @@ main(int argc, char **argv)
const char *path;
char *dir = NULL;
Eina_Bool changed = EINA_FALSE;
Eina_Bool flush = EINA_FALSE;
int lockfd = -1;
int tmpfd = -1;
char **keys;
@ -719,11 +791,6 @@ main(int argc, char **argv)
eina_array_push(extra_dirs, argv[++i]);
}
}
if (exts->count == 0)
{
ERR("Error: Need to pass extensions to icon cache create process");
return -1;
}
if (!eet_init()) return -1;
if (!ecore_init()) return -1;
@ -777,6 +844,17 @@ main(int argc, char **argv)
theme_version->major = EFREET_ICON_CACHE_MAJOR;
theme_version->minor = EFREET_ICON_CACHE_MINOR;
if (add_data(theme_ef, exts, EFREET_CACHE_ICON_EXTENSIONS))
flush = EINA_TRUE;
if (add_data(theme_ef, extra_dirs, EFREET_CACHE_ICON_EXTRA_DIRS))
flush = EINA_TRUE;
if (exts->count == 0)
{
ERR("Need to pass extensions to icon cache create process");
goto on_error_efreet;
}
keys = eet_list(theme_ef, "*", &num);
if (keys)
{
@ -831,9 +909,9 @@ main(int argc, char **argv)
icon_ef = eet_open(efreet_icon_cache_file(theme->theme.name.internal), EET_FILE_MODE_READ_WRITE);
if (!icon_ef) goto on_error_efreet;
icon_version = eet_data_read(icon_ef, efreet_version_edd(), EFREET_CACHE_VERSION);
if (icon_version &&
if (flush || (icon_version &&
((icon_version->major != EFREET_ICON_CACHE_MAJOR) ||
(icon_version->minor != EFREET_ICON_CACHE_MINOR)))
(icon_version->minor != EFREET_ICON_CACHE_MINOR))))
{
// delete old cache
eet_close(icon_ef);
@ -868,6 +946,8 @@ main(int argc, char **argv)
theme->changed = check_changed(theme);
if (theme->changed)
changed = EINA_TRUE;
if (flush)
changed = theme->changed = EINA_TRUE;
if (changed && theme->dirs)
{
efreet_hash_free(theme->dirs, free);
@ -920,9 +1000,9 @@ main(int argc, char **argv)
icon_ef = eet_open(efreet_icon_cache_file(EFREET_CACHE_ICON_FALLBACK), EET_FILE_MODE_READ_WRITE);
if (!icon_ef) goto on_error_efreet;
icon_version = eet_data_read(icon_ef, efreet_version_edd(), EFREET_CACHE_VERSION);
if (icon_version &&
if (flush || (icon_version &&
((icon_version->major != EFREET_ICON_CACHE_MAJOR) ||
(icon_version->minor != EFREET_ICON_CACHE_MINOR)))
(icon_version->minor != EFREET_ICON_CACHE_MINOR))))
{
// delete old cache
eet_close(icon_ef);
@ -940,6 +1020,7 @@ main(int argc, char **argv)
icon_version->major = EFREET_ICON_CACHE_MAJOR;
icon_version->minor = EFREET_ICON_CACHE_MINOR;
/* load icons */
icons = eina_hash_string_superfast_new(NULL);
keys = eet_list(icon_ef, "*", &num);
if (keys)
@ -957,6 +1038,8 @@ main(int argc, char **argv)
if (!theme)
theme = NEW(Efreet_Cache_Icon_Theme, 1);
theme->changed = changed;
if (flush)
changed = theme->changed = EINA_TRUE;
if (changed && theme->dirs)
{
efreet_hash_free(theme->dirs, free);
@ -995,6 +1078,9 @@ main(int argc, char **argv)
/* save data */
eet_data_write(theme_ef, efreet_version_edd(), EFREET_CACHE_VERSION, theme_version, 1);
save_data(theme_ef, exts, EFREET_CACHE_ICON_EXTENSIONS);
save_data(theme_ef, extra_dirs, EFREET_CACHE_ICON_EXTRA_DIRS);
eet_close(theme_ef);
efreet_setowner(efreet_icon_theme_cache_file());
free(theme_version);

View File

@ -11,6 +11,8 @@
#define EFREET_CACHE_VERSION "__efreet//version"
#define EFREET_CACHE_ICON_FALLBACK "__efreet_fallback"
#define EFREET_CACHE_ICON_EXTENSIONS "__efreet//icon_extensions"
#define EFREET_CACHE_ICON_EXTRA_DIRS "__efreet//icon_extra_dirs"
#define EFREET_CACHE_DESKTOP_DIRS "__efreet//desktop_dirs"
EAPI const char *efreet_desktop_util_cache_file(void);