#include <Ecore.h>
#include <Ecore_File.h>
-#define EFREET_MODULE_LOG_DOM /* no logging in this file */
+#define EFREET_MODULE_LOG_DOM _efreet_icon_cache_log_dom
+static int _efreet_icon_cache_log_dom = -1;
#include "Efreet.h"
#include "efreet_private.h"
static Eina_Array *extra_dirs = NULL;
static Eina_Array *strs = NULL;
static Eina_Hash *icon_themes = NULL;
-static int verbose = 0;
static Eina_Bool
cache_directory_find(Eina_Hash *dirs, const char *dir)
Efreet_Icon_Theme *inherit;
inherit = eina_hash_find(icon_themes, name);
- if (!inherit && verbose)
- fprintf(stderr, "Theme `%s` not found for `%s`.\n",
- name, theme->name.internal);
+ if (!inherit)
+ INF("Theme `%s` not found for `%s`.",
+ name, theme->name.internal);
if (!cache_scan(inherit, themes, icons, dirs, changed)) return EINA_FALSE;
}
}
Efreet_Cache_Icon_Theme *inherit;
inherit = eina_hash_find(icon_themes, name);
- if (!inherit && verbose)
- fprintf(stderr, "Theme `%s` not found for `%s`.\n",
+ if (!inherit)
+ INF("Theme `%s` not found for `%s`.",
name, theme->theme.name.internal);
if (check_changed(inherit)) return EINA_TRUE;
}
fl.l_whence = SEEK_SET;
if (fcntl(lockfd, F_SETLK, &fl) < 0)
{
- if (verbose) printf("LOCKED! You may want to delete %s if this persists\n", file);
+ WRN("LOCKED! You may want to delete %s if this persists", file);
close(lockfd);
return -1;
}
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)
{
const char *path;
char *dir = NULL;
Eina_Bool changed = EINA_FALSE;
+ Eina_Bool flush = EINA_FALSE;
int lockfd = -1;
int tmpfd = -1;
char **keys;
/* init external subsystems */
if (!eina_init()) return -1;
+ _efreet_icon_cache_log_dom =
+ eina_log_domain_register("efreet_icon_cache", EFREET_DEFAULT_LOG_COLOR);
+ if (_efreet_icon_cache_log_dom < 0)
+ {
+ EINA_LOG_ERR("Efreet: Could not create a log domain for efreet_icon_cache.");
+ return -1;
+ }
+
+ eina_log_domain_level_set("efreet_icon_cache", EINA_LOG_LEVEL_ERR);
exts = eina_array_new(10);
extra_dirs = eina_array_new(10);
for (i = 1; i < argc; i++)
{
- if (!strcmp(argv[i], "-v")) verbose = 1;
+ if (!strcmp(argv[i], "-v"))
+ eina_log_domain_level_set("efreet_icon_cache", EINA_LOG_LEVEL_DBG);
else if ((!strcmp(argv[i], "-h")) ||
(!strcmp(argv[i], "-help")) ||
(!strcmp(argv[i], "--h")) ||
eina_array_push(extra_dirs, argv[++i]);
}
}
- if (exts->count == 0)
- {
- printf("Error: Need to pass extensions to icon cache create process\n");
- return -1;
- }
if (!eet_init()) return -1;
if (!ecore_init()) return -1;
icon_themes = eina_hash_string_superfast_new(EINA_FREE_CB(icon_theme_free));
+ INF("opening theme cache");
/* open theme file */
theme_ef = eet_open(efreet_icon_theme_cache_file(), EET_FILE_MODE_READ_WRITE);
if (!theme_ef) goto on_error_efreet;
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)
{
free(keys);
}
+ INF("scan for themes");
/* scan themes */
cache_theme_scan(efreet_icon_deprecated_user_dir_get());
cache_theme_scan(efreet_icon_user_dir_get());
#ifndef STRICT_SPEC
if (!theme->theme.name.name) continue;
#endif
+ INF("scan theme %s", theme->theme.name.name);
changed = EINA_FALSE;
themes = eina_hash_string_superfast_new(NULL);
+ INF("open icon file");
/* open icon file */
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);
free(keys);
}
- changed = theme->changed = check_changed(theme);
- if (theme->changed && theme->dirs)
+ 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);
theme->dirs = NULL;
if (!theme->dirs)
theme->dirs = eina_hash_string_superfast_new(NULL);
+ INF("scan icons\n");
if (cache_scan(&(theme->theme), themes, icons, theme->dirs, &changed))
{
- if (verbose)
- fprintf(stderr, "generated: '%s' %i (%i)\n",
- theme->theme.name.internal,
- changed,
- eina_hash_population(icons));
+ INF("generated: '%s' %i (%i)",
+ theme->theme.name.internal,
+ changed,
+ eina_hash_population(icons));
if (changed)
{
Eina_Iterator *icons_it;
eina_hash_free(themes);
eina_hash_free(icons);
- if (theme->changed || changed)
+ if (changed)
{
- if (theme->changed && verbose)
- fprintf(stderr, "theme change: %s %lld\n", theme->theme.name.internal, theme->last_cache_check);
+ if (theme->changed)
+ INF("theme change: %s %lld", theme->theme.name.internal, theme->last_cache_check);
eet_data_write(theme_ef, theme_edd, theme->theme.name.internal, theme, 1);
}
changed = EINA_FALSE;
+ INF("open fallback file");
/* open icon file */
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);
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)
free(keys);
}
+ theme = eet_data_read(theme_ef, theme_edd, EFREET_CACHE_ICON_FALLBACK);
+ if (!theme)
+ theme = NEW(Efreet_Cache_Icon_Theme, 1);
theme->changed = changed;
- if (theme->changed && theme->dirs)
+ if (flush)
+ changed = theme->changed = EINA_TRUE;
+ if (changed && theme->dirs)
{
efreet_hash_free(theme->dirs, free);
theme->dirs = NULL;
}
- theme = eet_data_read(theme_ef, theme_edd, EFREET_CACHE_ICON_FALLBACK);
- if (!theme)
- theme = NEW(Efreet_Cache_Icon_Theme, 1);
if (!theme->dirs)
theme->dirs = eina_hash_string_superfast_new(NULL);
+ INF("scan fallback icons");
/* Save fallback in the right part */
if (cache_fallback_scan(icons, theme->dirs, &changed))
{
- if (verbose)
- fprintf(stderr, "generated: fallback %i (%i)\n", changed, eina_hash_population(icons));
+ WRN("generated: fallback %i (%i)", changed, eina_hash_population(icons));
if (changed)
{
Eina_Iterator *icons_it;
/* 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);
}
}
+ INF("done");
on_error_efreet:
efreet_shutdown();
ecore_shutdown();
eet_shutdown();
+ eina_log_domain_unregister(_efreet_icon_cache_log_dom);
eina_shutdown();
return 0;