From f72d4f934208854f517606fe89c418dfa0fd05dd Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Mon, 1 Mar 2010 18:16:32 +0000 Subject: [PATCH] Eet cache for efreet desktop SVN revision: 46726 --- legacy/efreet/configure.ac | 28 +- legacy/efreet/src/Makefile.am | 2 +- legacy/efreet/src/bin/Makefile.am | 39 +- legacy/efreet/src/bin/ef_cache.c | 48 - .../src/bin/efreet_desktop_cache_create.c | 254 ++++ legacy/efreet/src/lib/Makefile.am | 1 + legacy/efreet/src/lib/efreet.c | 8 +- legacy/efreet/src/lib/efreet_base.c | 38 +- legacy/efreet/src/lib/efreet_desktop.c | 235 +++- legacy/efreet/src/lib/efreet_desktop.h | 15 +- legacy/efreet/src/lib/efreet_icon.c | 4 + legacy/efreet/src/lib/efreet_ini.c | 7 + legacy/efreet/src/lib/efreet_menu.c | 14 +- legacy/efreet/src/lib/efreet_private.h | 22 +- legacy/efreet/src/lib/efreet_utils.c | 1159 ++++------------- legacy/efreet/src/lib/efreet_utils.h | 19 - legacy/efreet/src/{bin => tests}/.cvsignore | 0 legacy/efreet/src/tests/Makefile.am | 43 + .../src/{bin => tests}/compare/.cvsignore | 0 .../src/{bin => tests}/compare/Makefile.am | 0 .../efreet/src/{bin => tests}/compare/comp.h | 0 .../src/{bin => tests}/compare/efreet_alloc.c | 0 .../compare/efreet_menu_alloc.c | 0 .../efreet/src/{bin => tests}/data/.cvsignore | 0 .../src/{bin => tests}/data/Makefile.am | 0 legacy/efreet/src/{bin => tests}/data/entry | Bin .../efreet/src/{bin => tests}/data/entry.png | Bin .../efreet/src/{bin => tests}/data/long.ini | 0 .../src/{bin => tests}/data/preferences.menu | 0 .../src/{bin => tests}/data/sub/.cvsignore | 0 .../src/{bin => tests}/data/sub/Makefile.am | 0 .../src/{bin => tests}/data/sub/test.desktop | 0 .../src/{bin => tests}/data/test.desktop | 0 .../efreet/src/{bin => tests}/data/test.ini | 0 .../efreet/src/{bin => tests}/data/test.menu | 0 .../src/{bin => tests}/data/test_garbage | 0 .../data/test_menu_bad_comment.menu | 0 .../data/test_menu_slash_bad.menu | 0 .../src/{bin => tests}/data/test_type.desktop | 0 legacy/efreet/src/tests/ef_cache.c | 143 ++ .../efreet/src/{bin => tests}/ef_data_dirs.c | 6 +- legacy/efreet/src/{bin => tests}/ef_desktop.c | 8 + .../efreet/src/{bin => tests}/ef_icon_theme.c | 0 legacy/efreet/src/{bin => tests}/ef_ini.c | 0 legacy/efreet/src/{bin => tests}/ef_locale.c | 0 legacy/efreet/src/{bin => tests}/ef_menu.c | 0 legacy/efreet/src/{bin => tests}/ef_mime.c | 0 legacy/efreet/src/{bin => tests}/ef_test.h | 0 legacy/efreet/src/{bin => tests}/ef_utils.c | 6 + .../src/{bin => tests}/efreet_spec_test.c | 0 legacy/efreet/src/{bin => tests}/main.c | 0 51 files changed, 965 insertions(+), 1134 deletions(-) delete mode 100644 legacy/efreet/src/bin/ef_cache.c create mode 100644 legacy/efreet/src/bin/efreet_desktop_cache_create.c rename legacy/efreet/src/{bin => tests}/.cvsignore (100%) create mode 100644 legacy/efreet/src/tests/Makefile.am rename legacy/efreet/src/{bin => tests}/compare/.cvsignore (100%) rename legacy/efreet/src/{bin => tests}/compare/Makefile.am (100%) rename legacy/efreet/src/{bin => tests}/compare/comp.h (100%) rename legacy/efreet/src/{bin => tests}/compare/efreet_alloc.c (100%) rename legacy/efreet/src/{bin => tests}/compare/efreet_menu_alloc.c (100%) rename legacy/efreet/src/{bin => tests}/data/.cvsignore (100%) rename legacy/efreet/src/{bin => tests}/data/Makefile.am (100%) rename legacy/efreet/src/{bin => tests}/data/entry (100%) rename legacy/efreet/src/{bin => tests}/data/entry.png (100%) rename legacy/efreet/src/{bin => tests}/data/long.ini (100%) rename legacy/efreet/src/{bin => tests}/data/preferences.menu (100%) rename legacy/efreet/src/{bin => tests}/data/sub/.cvsignore (100%) rename legacy/efreet/src/{bin => tests}/data/sub/Makefile.am (100%) rename legacy/efreet/src/{bin => tests}/data/sub/test.desktop (100%) rename legacy/efreet/src/{bin => tests}/data/test.desktop (100%) rename legacy/efreet/src/{bin => tests}/data/test.ini (100%) rename legacy/efreet/src/{bin => tests}/data/test.menu (100%) rename legacy/efreet/src/{bin => tests}/data/test_garbage (100%) rename legacy/efreet/src/{bin => tests}/data/test_menu_bad_comment.menu (100%) rename legacy/efreet/src/{bin => tests}/data/test_menu_slash_bad.menu (100%) rename legacy/efreet/src/{bin => tests}/data/test_type.desktop (100%) create mode 100644 legacy/efreet/src/tests/ef_cache.c rename legacy/efreet/src/{bin => tests}/ef_data_dirs.c (97%) rename legacy/efreet/src/{bin => tests}/ef_desktop.c (99%) rename legacy/efreet/src/{bin => tests}/ef_icon_theme.c (100%) rename legacy/efreet/src/{bin => tests}/ef_ini.c (100%) rename legacy/efreet/src/{bin => tests}/ef_locale.c (100%) rename legacy/efreet/src/{bin => tests}/ef_menu.c (100%) rename legacy/efreet/src/{bin => tests}/ef_mime.c (100%) rename legacy/efreet/src/{bin => tests}/ef_test.h (100%) rename legacy/efreet/src/{bin => tests}/ef_utils.c (88%) rename legacy/efreet/src/{bin => tests}/efreet_spec_test.c (100%) rename legacy/efreet/src/{bin => tests}/main.c (100%) diff --git a/legacy/efreet/configure.ac b/legacy/efreet/configure.ac index 6be0759298..e933dd8b07 100644 --- a/legacy/efreet/configure.ac +++ b/legacy/efreet/configure.ac @@ -73,7 +73,7 @@ AC_FUNC_ALLOCA AC_CHECK_HEADERS([arpa/inet.h]) -PKG_CHECK_MODULES(EFREET, [eina-0 ecore >= 0.9.9 ecore-file >= 0.9.9]) +PKG_CHECK_MODULES(EFREET, [eet eina-0 ecore >= 0.9.9 ecore-file >= 0.9.9]) PKG_CHECK_MODULES(EINA, [eina-0]) requirements="ecore-file ecore eina-0" @@ -92,15 +92,16 @@ if test "x$enable_sloppy_spec" = "xyes" ; then AC_DEFINE(SLOPPY_SPEC, 1, [Sloppy Spec Compliance]) fi -AC_ARG_ENABLE(hidden-visibility, - [AC_HELP_STRING([--enable-hidden-visibility],[Enable hidden visibility])], - [enable_hidden_visibility=$enableval], [enable_hidden_visibility="auto"]) -if test "x$enable_hidden_visibility" = "xyes" ; then - CPPFLAGS="$CPPFLAGS -fvisibility=hidden" -else - AC_DEFINE(DEFAULT_VISIBLITY, 1, [Default visibility]) -fi -AM_CONDITIONAL(DEFAULT_VISIBILITY, test "x$enable_hidden_visibility" != "xyes") +#AC_ARG_ENABLE(hidden-visibility, +# [AC_HELP_STRING([--enable-hidden-visibility],[Enable hidden visibility])], +# [enable_hidden_visibility=$enableval], [enable_hidden_visibility="auto"]) +#if test "x$enable_hidden_visibility" = "xyes" ; then +# CPPFLAGS="$CPPFLAGS -fvisibility=hidden" +#else +# AC_DEFINE(DEFAULT_VISIBLITY, 1, [Default visibility]) +#fi +#AM_CONDITIONAL(DEFAULT_VISIBILITY, test "x$enable_hidden_visibility" != "xyes") +AM_CONDITIONAL(DEFAULT_VISIBILITY, 0) EFL_CHECK_DOXYGEN([build_doc="yes"], [build_doc="no"]) AC_SUBST(requirements) @@ -114,10 +115,11 @@ doc/Makefile doc/Doxyfile src/Makefile src/lib/Makefile +src/tests/Makefile +src/tests/data/Makefile +src/tests/data/sub/Makefile +src/tests/compare/Makefile src/bin/Makefile -src/bin/data/Makefile -src/bin/data/sub/Makefile -src/bin/compare/Makefile ], [] ) diff --git a/legacy/efreet/src/Makefile.am b/legacy/efreet/src/Makefile.am index ad292fa269..add035f9cc 100644 --- a/legacy/efreet/src/Makefile.am +++ b/legacy/efreet/src/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = lib bin +SUBDIRS = lib bin tests MAINTAINERCLEANFILES = Makefile.in diff --git a/legacy/efreet/src/bin/Makefile.am b/legacy/efreet/src/bin/Makefile.am index e0fac4cbe7..cbdde9c195 100644 --- a/legacy/efreet/src/bin/Makefile.am +++ b/legacy/efreet/src/bin/Makefile.am @@ -1,6 +1,4 @@ -SUBDIRS = data compare - MAINTAINERCLEANFILES = Makefile.in AM_CPPFLAGS = \ @@ -11,33 +9,14 @@ AM_CPPFLAGS = \ -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ @EFREET_CFLAGS@ -bin_PROGRAMS = efreet_test efreet_spec_test efreet_cache_test +bin_PROGRAMS = \ +efreet_desktop_cache_create -efreet_test_DEPENDENCIES = $(top_builddir)/src/lib/libefreet.la \ - $(top_builddir)/src/lib/libefreet_mime.la -efreet_test_LDADD = $(top_builddir)/src/lib/libefreet.la \ - $(top_builddir)/src/lib/libefreet_mime.la \ - @EFREET_LIBS@ -efreet_test_SOURCES = \ -ef_test.h \ -ef_data_dirs.c \ -ef_icon_theme.c \ -ef_ini.c \ -ef_utils.c \ -ef_desktop.c \ -ef_menu.c \ -ef_mime.c \ -main.c +efreet_desktop_cache_create_DEPENDENCIES = \ +$(top_builddir)/src/lib/libefreet.la +efreet_desktop_cache_create_LDADD = \ +$(top_builddir)/src/lib/libefreet.la \ +@EFREET_LIBS@ -if DEFAULT_VISIBILITY -efreet_test_SOURCES += \ -ef_locale.c -endif - -efreet_spec_test_LDADD = $(top_builddir)/src/lib/libefreet.la @EINA_LIBS@ -efreet_spec_test_SOURCES = \ -efreet_spec_test.c - -efreet_cache_test_LDADD = $(top_builddir)/src/lib/libefreet.la @EFREET_LIBS@ -efreet_cache_test_SOURCES = \ -ef_cache.c +efreet_desktop_cache_create_SOURCES = \ +efreet_desktop_cache_create.c diff --git a/legacy/efreet/src/bin/ef_cache.c b/legacy/efreet/src/bin/ef_cache.c deleted file mode 100644 index ebd718b1ae..0000000000 --- a/legacy/efreet/src/bin/ef_cache.c +++ /dev/null @@ -1,48 +0,0 @@ -#include "Efreet.h" -#include -#include -#include "ef_test.h" - -static int -timer(void *data __UNUSED__) -{ - Eina_List *list; - Eina_List *l; - Efreet_Desktop *desktop; - double start; - - start = ecore_time_get(); - desktop = efreet_util_desktop_name_find("Mozilla Firefox"); - printf("Mozilla Firefox: %p %.3f\n", desktop, (ecore_time_get() - start)); - start = ecore_time_get(); - desktop = efreet_util_desktop_generic_name_find("Mail/News"); - printf("Mail/News: %p %.3f\n", desktop, (ecore_time_get() - start)); - start = ecore_time_get(); - desktop = efreet_util_desktop_wm_class_find("Mozilla-firefox-bin", NULL); - printf("Mozilla-firefox-bin: %p %.3f\n", desktop, (ecore_time_get() - start)); - - list = efreet_util_desktop_mime_list("application/ogg"); - if (list) - { - EINA_LIST_FOREACH(list, l, desktop) - { - printf("application/ogg: %s\n", desktop->name); - } - while (list) - list = eina_list_remove_list(list, list); - } - - return 0; -} - -int -main(int argc __UNUSED__, char **argv __UNUSED__) -{ - if (!efreet_init()) return 1; - if (!efreet_util_init()) return 1; - ecore_timer_add(2.0, timer, NULL); - ecore_main_loop_begin(); - efreet_util_shutdown(); - efreet_shutdown(); - return 0; -} diff --git a/legacy/efreet/src/bin/efreet_desktop_cache_create.c b/legacy/efreet/src/bin/efreet_desktop_cache_create.c new file mode 100644 index 0000000000..80f2a975c2 --- /dev/null +++ b/legacy/efreet/src/bin/efreet_desktop_cache_create.c @@ -0,0 +1,254 @@ +/* vim: set sw=4 ts=4 sts=4 et: */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "Efreet.h" +#include "efreet_private.h" + +static Eet_Data_Descriptor *edd = NULL; +static Eet_File *ef = NULL; +static Eet_File *util_ef = NULL; + +static Eina_Hash *file_ids = NULL; + +static int +cache_add(const char *path, const char *file_id, int priority) +{ + Efreet_Desktop *desk; + char *ext; + + ext = strrchr(path, '.'); + if (!ext || strcmp(ext, ".desktop")) return 1; + desk = efreet_desktop_new(path); + + if (!desk || desk->type != EFREET_DESKTOP_TYPE_APPLICATION) + { + if (desk) efreet_desktop_free(desk); + return 1; + } + if (!eet_data_write(ef, edd, desk->orig_path, desk, 0)) + return 0; + if (!eina_hash_find(file_ids, file_id)) + { + int id; + char key[PATH_MAX]; + char *data; + int i = 0; + Eina_List *l; + + id = eina_hash_population(file_ids); + i = 0; + EINA_LIST_FOREACH(desk->mime_types, l, data) + { + snprintf(key, sizeof(key), "%d::%d::m", id, i++); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + i = 0; + EINA_LIST_FOREACH(desk->categories, l, data) + { + snprintf(key, sizeof(key), "%d::%d::ca", id, i++); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + if (desk->startup_wm_class) + { + data = desk->startup_wm_class; + snprintf(key, sizeof(key), "%d::swc", id); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + if (desk->name) + { + data = desk->name; + snprintf(key, sizeof(key), "%d::n", id); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + if (desk->generic_name) + { + data = desk->generic_name; + snprintf(key, sizeof(key), "%d::gn", id); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + if (desk->comment) + { + data = desk->comment; + snprintf(key, sizeof(key), "%d::co", id); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + if (desk->exec) + { + data = desk->exec; + snprintf(key, sizeof(key), "%d::e", id); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + if (desk->orig_path) + { + data = desk->orig_path; + snprintf(key, sizeof(key), "%d::op", id); + if (!eet_write(util_ef, key, data, strlen(data) + 1, 0)) return 0; + } + snprintf(key, sizeof(key), "%d::fi", id); + if (!eet_write(util_ef, key, file_id, strlen(file_id) + 1, 0)) return 0; + + eina_hash_add(file_ids, file_id, (void *)1); + } + efreet_desktop_free(desk); + return 1; +} + + +static int +cache_scan(const char *path, const char *base_id, int priority) +{ + char file_id[PATH_MAX]; + char buf[PATH_MAX]; + DIR *files; + struct dirent *file; + + if (!ecore_file_is_dir(path)) return 1; + + files = opendir(path); + file_id[0] = '\0'; + while ((file = readdir(files))) + { + if (!file) break; + if (!strcmp(file->d_name, ".") || !strcmp(file->d_name, "..")) continue; + + snprintf(buf, sizeof(buf), "%s/%s", path, file->d_name); + if (*base_id) + snprintf(file_id, sizeof(file_id), "%s-%s", base_id, file->d_name); + else + strcpy(file_id, file->d_name); + + if (ecore_file_is_dir(buf)) + { + cache_scan(buf, file_id, priority); + } + else + { + if (!cache_add(buf, file_id, priority)) return 0; + } + } + closedir(files); + return 1; +} + +int +main(int argc, char **argv) +{ + /* TODO: + * - Add file monitor on files, so that we catch changes on files + * during whilst this program runs. + * - When creating new cache, do it on a tmp file, then rename tmp file + * to cache file. + */ + char file[PATH_MAX]; + Eina_List *dirs; + int priority = 0; + char *dir = NULL; + int fd = 0; + + /* init external subsystems */ + if (!eet_init()) goto eet_error; + if (!eina_init()) goto eina_error; + + /* create homedir */ + snprintf(file, sizeof(file), "%s/.efreet", efreet_home_dir_get()); + if (!ecore_file_mkpath(file)) goto efreet_error; + + /* create dir for desktop cache */ + dir = ecore_file_dir_get(efreet_desktop_cache_file()); + if (!ecore_file_mkpath(dir)) goto efreet_error; + free(dir); + /* create desktop cache file, so that efreet_init wont run another instance of this program */ + fd = open(efreet_desktop_cache_file(), O_CREAT | O_TRUNC | O_RDONLY, S_IRUSR | S_IWUSR); + if (fd < 0) goto efreet_error; + close(fd); + + /* create dir for util cache */ + dir = ecore_file_dir_get(efreet_util_cache_file()); + if (!ecore_file_mkpath(dir)) goto efreet_error; + free(dir); + /* create util cache file */ + fd = open(efreet_util_cache_file(), O_CREAT | O_TRUNC | O_RDONLY, S_IRUSR | S_IWUSR); + if (fd < 0) goto efreet_error; + close(fd); + + /* lock process, so that we only run one copy of this program */ + snprintf(file, sizeof(file), "%s/.efreet/lock", efreet_home_dir_get()); + fd = open(file, O_CREAT | O_TRUNC | O_RDONLY, S_IRUSR | S_IWUSR); + if (fd < 0) goto efreet_error; + if (flock(fd, LOCK_EX | LOCK_NB) < 0) + { + close(fd); + goto efreet_error; + } + + /* finish efreet init */ + if (!efreet_init()) goto efreet_error; + edd = efreet_desktop_edd_init(); + if (!edd) goto edd_error; + + /* create cache */ + ef = eet_open(efreet_desktop_cache_file(), EET_FILE_MODE_WRITE); + if (!ef) goto error; + util_ef = eet_open(efreet_util_cache_file(), EET_FILE_MODE_WRITE); + if (!util_ef) goto error; + + file_ids = eina_hash_string_superfast_new(NULL); + + if (!file_ids) goto error; + + dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), + "applications"); + if (!dirs) goto error; + while (dirs) + { + char file_id[PATH_MAX] = { '\0' }; + char *path; + + path = eina_list_data_get(dirs); + if (path) + { + if (!cache_scan(path, file_id, priority++)) goto error; + free(path); + } + dirs = eina_list_remove_list(dirs, dirs); + } + eina_hash_free(file_ids); + + /* cleanup */ + eet_close(util_ef); + eet_close(ef); + + efreet_desktop_edd_shutdown(edd); + efreet_shutdown(); + eet_shutdown(); + eina_shutdown(); + close(fd); + return 0; +error: + printf("error\n"); + IF_FREE(dir); + efreet_desktop_edd_shutdown(edd); +edd_error: + printf("error\n"); + efreet_shutdown(); +efreet_error: + printf("error\n"); + eina_shutdown(); +eina_error: + printf("error\n"); + eet_shutdown(); +eet_error: + printf("error\n"); + if (fd > 0) close(fd); + return 1; +} diff --git a/legacy/efreet/src/lib/Makefile.am b/legacy/efreet/src/lib/Makefile.am index 0b4e5f64bf..eff8ed6f5a 100644 --- a/legacy/efreet/src/lib/Makefile.am +++ b/legacy/efreet/src/lib/Makefile.am @@ -31,6 +31,7 @@ dist_installed_headers_DATA = $(EFREETHEADERS) Efreet_Mime.h Efreet_Trash.h libefreet_la_SOURCES = $(EFREETSOURCES) libefreet_la_CPPFLAGS = \ -DPACKAGE_DATA_DIR=\"$(datadir)\" \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ -I$(top_builddir)/src/lib \ -I$(top_srcdir)/src/lib \ @EFL_EFREET_BUILD@ \ diff --git a/legacy/efreet/src/lib/efreet.c b/legacy/efreet/src/lib/efreet.c index c2f8213533..895a57d831 100644 --- a/legacy/efreet/src/lib/efreet.c +++ b/legacy/efreet/src/lib/efreet.c @@ -33,12 +33,14 @@ efreet_init(void) if (!eina_init()) return --_efreet_init_count; + if (!eet_init()) + goto shutdown_eina; _efreet_log_domain_global = eina_log_domain_register("Efreet", EFREET_DEFAULT_LOG_COLOR); if (_efreet_log_domain_global < 0) { printf("Efreet could create a general log domain.\n"); - goto shutdown_eina; + goto shutdown_eet; } if (!efreet_base_init()) @@ -73,6 +75,8 @@ shutdown_efreet_base: efreet_base_shutdown(); unregister_log_domain: eina_log_domain_unregister(_efreet_log_domain_global); +shutdown_eet: + eet_shutdown(); shutdown_eina: eina_shutdown(); @@ -98,6 +102,7 @@ efreet_shutdown(void) efreet_xml_shutdown(); efreet_base_shutdown(); eina_log_domain_unregister(_efreet_log_domain_global); + eet_shutdown(); eina_shutdown(); IF_FREE(efreet_lang); @@ -234,6 +239,7 @@ efreet_parse_locale_setting(const char *env) size_t efreet_array_cat(char *buffer, size_t size, const char *strs[]) { + /* TODO: Most functions calling this use static strings. Make a version which handles this, use sizeof and memcpy */ int i; size_t n; for (i = 0, n = 0; n < size && strs[i]; i++) diff --git a/legacy/efreet/src/lib/efreet_base.c b/legacy/efreet/src/lib/efreet_base.c index 318ac8baf5..edb9f7659c 100644 --- a/legacy/efreet/src/lib/efreet_base.c +++ b/legacy/efreet/src/lib/efreet_base.c @@ -35,6 +35,7 @@ static int _efreet_base_log_dom = -1; static const char *efreet_dir_get(const char *key, const char *fallback); static Eina_List *efreet_dirs_get(const char *key, const char *fallback); +static const char *efreet_path_clean(const char *path); /** * @internal @@ -76,8 +77,10 @@ efreet_base_shutdown(void) * @internal * @return Returns the users home directory * @brief Gets the users home directory and returns it. + * + * Needs EAPI because of helper binaries */ -const char * +EAPI const char * efreet_home_dir_get(void) { if (efreet_home_dir) return efreet_home_dir; @@ -90,7 +93,7 @@ efreet_home_dir_get(void) if (!efreet_home_dir || efreet_home_dir[0] == '\0') efreet_home_dir = "/tmp"; - efreet_home_dir = eina_stringshare_add(efreet_home_dir); + efreet_home_dir = efreet_path_clean(efreet_home_dir); return efreet_home_dir; } @@ -201,10 +204,10 @@ efreet_dir_get(const char *key, const char *fallback) dir = malloc(sizeof(char) * len); snprintf(dir, len, "%s%s", user, fallback); - t = eina_stringshare_add(dir); + t = efreet_path_clean(dir); FREE(dir); } - else t = eina_stringshare_add(dir); + else t = efreet_path_clean(dir); return t; } @@ -237,14 +240,37 @@ efreet_dirs_get(const char *key, const char *fallback) { *p = '\0'; if (!eina_list_search_unsorted(dirs, EINA_COMPARE_CB(strcmp), s)) - dirs = eina_list_append(dirs, (void *)eina_stringshare_add(s)); + dirs = eina_list_append(dirs, (void *)efreet_path_clean(s)); s = ++p; p = strchr(s, EFREET_PATH_SEP); } if (!eina_list_search_unsorted(dirs, EINA_COMPARE_CB(strcmp), s)) - dirs = eina_list_append(dirs, (void *)eina_stringshare_add(s)); + dirs = eina_list_append(dirs, (void *)efreet_path_clean(s)); FREE(tmp); return dirs; } + +static const char * +efreet_path_clean(const char *path) +{ + char *p, *pp; + const char *ret; + + if (!path) return eina_stringshare_add(""); + if (!*path) return eina_stringshare_add(""); + + p = strdup(path); + if (!p) return eina_stringshare_add(""); + for (pp = p; *pp; pp++) + { + if (*pp == '/' && *(pp + 1) == '/') + memmove(pp, pp + 1, strlen(pp + 1) + 1); + if (*pp == '/' && *(pp + 1) == '\0') + *pp = '\0'; + } + ret = eina_stringshare_add(p); + free(p); + return ret; +} diff --git a/legacy/efreet/src/lib/efreet_desktop.c b/legacy/efreet/src/lib/efreet_desktop.c index 305a468dce..1e889d460c 100644 --- a/legacy/efreet/src/lib/efreet_desktop.c +++ b/legacy/efreet/src/lib/efreet_desktop.c @@ -44,7 +44,9 @@ static Eina_List *efreet_desktop_types = NULL; */ static int efreet_desktop_command_file_id = 0; -static int cache_flush = 0; +static char *cache_file = NULL; +static Eet_File *cache = NULL; +static Eet_Data_Descriptor *edd = NULL; #ifdef EFREET_MODULE_LOG_DOM #undef EFREET_MODULE_LOG_DOM @@ -72,7 +74,9 @@ struct Efreet_Desktop_Type_Info }; static int efreet_desktop_read(Efreet_Desktop *desktop); +#if 0 static void efreet_desktop_clear(Efreet_Desktop *desktop); +#endif static Efreet_Desktop_Type_Info *efreet_desktop_type_parse(const char *type_str); static void *efreet_desktop_application_fields_parse(Efreet_Desktop *desktop, Efreet_Ini *ini); @@ -148,10 +152,10 @@ efreet_desktop_init(void) return 0; } if (!ecore_file_init()) - { - eina_log_domain_unregister(_efreet_desktop_log_dom); - return 0; - } + goto ecore_error; + edd = efreet_desktop_edd_init(); + if (!edd) + goto edd_error; efreet_desktop_cache = eina_hash_string_superfast_new(NULL); efreet_desktop_types = NULL; @@ -166,7 +170,26 @@ efreet_desktop_init(void) EFREET_DESKTOP_TYPE_DIRECTORY = efreet_desktop_type_add("Directory", NULL, NULL, NULL); + /* TODO: + * Should add a lock here, so that several programs starting at the same + * time wont run several copies of efreet_desktop_cache_create + * + * Or do the right thing and run the exe with ecore_exe + */ + if (!ecore_file_exists(efreet_desktop_cache_file())) + system(PACKAGE_BIN_DIR "/efreet_desktop_cache_create"); + /* TODO: Need file monitor on cache in case it is updated */ + cache = eet_open(efreet_desktop_cache_file(), EET_FILE_MODE_READ); + //if (!cache) goto error; return 1; + +error: + efreet_desktop_edd_shutdown(edd); +edd_error: + ecore_file_shutdown(); +ecore_error: + eina_log_domain_unregister(_efreet_desktop_log_dom); + return 0; } /** @@ -188,8 +211,40 @@ efreet_desktop_shutdown(void) efreet_desktop_types = eina_list_remove_list(efreet_desktop_types, efreet_desktop_types); } + if (cache) eet_close(cache); + efreet_desktop_edd_shutdown(edd); ecore_file_shutdown(); eina_log_domain_unregister(_efreet_desktop_log_dom); + IF_FREE(cache_file); +} + +/* + * Needs EAPI because of helper binaries + */ +EAPI const char * +efreet_desktop_cache_file(void) +{ + char tmp[PATH_MAX] = { '\0' }; + const char *home, *lang, *country, *modifier; + + if (cache_file) return cache_file; + + home = efreet_home_dir_get(); + lang = efreet_lang_get(); + country = efreet_lang_country_get(); + modifier = efreet_lang_modifier_get(); + + if (lang && country && modifier) + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_%s_%s@%s.cache", home, lang, country, modifier); + else if (lang && country) + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_%s_%s.cache", home, lang, country); + else if (lang) + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_%s.cache", home, lang); + else + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop.cache", home); + + cache_file = strdup(tmp); + return cache_file; } /** @@ -203,9 +258,13 @@ efreet_desktop_cache_check(Efreet_Desktop *desktop) { if (!desktop) return 0; + /* TODO: + * We always accept files in cache, but we should update cache + * when a file has changed on disk + */ + if (desktop->eet) return 1; /* have we modified this file since we last read it in? */ - if ((desktop->cache_flush != cache_flush) || - (ecore_file_mod_time(desktop->orig_path) != desktop->load_time)) + if (ecore_file_mod_time(desktop->orig_path) != desktop->load_time) return 0; return 1; @@ -234,14 +293,16 @@ efreet_desktop_get(const char *file) return desktop; } +#if 0 efreet_desktop_clear(desktop); if (efreet_desktop_read(desktop)) { desktop->ref++; - desktop->cache_flush = cache_flush; return desktop; } +#endif + /* TODO: Submit event to signal that this file has changed */ desktop->cached = 0; eina_hash_del(efreet_desktop_cache, file, NULL); } @@ -250,7 +311,7 @@ efreet_desktop_get(const char *file) desktop = efreet_desktop_new(file); if (!desktop) return NULL; - eina_hash_add(efreet_desktop_cache, file, desktop); + if (efreet_desktop_cache) eina_hash_add(efreet_desktop_cache, file, desktop); desktop->cached = 1; return desktop; } @@ -298,7 +359,20 @@ efreet_desktop_empty_new(const char *file) EAPI Efreet_Desktop * efreet_desktop_new(const char *file) { - Efreet_Desktop *desktop; + /* TODO: Need file monitor on file and events to notify change */ + Efreet_Desktop *desktop = NULL; + + if (cache) + { + /* TODO: Check if the cached version is out of date */ + desktop = eet_data_read(cache, edd, file); + if (desktop) + { + desktop->ref = 1; + desktop->eet = 1; + return desktop; + } + } if (!ecore_file_exists(file)) return NULL; @@ -314,7 +388,6 @@ efreet_desktop_new(const char *file) } desktop->ref = 1; - desktop->cache_flush = cache_flush; return desktop; } @@ -387,6 +460,7 @@ efreet_desktop_read(Efreet_Desktop *desktop) * @return Returns no value * @brief Frees the Efreet_Desktop's data */ +#if 0 static void efreet_desktop_clear(Efreet_Desktop *desktop) { @@ -428,6 +502,7 @@ efreet_desktop_clear(Efreet_Desktop *desktop) info->free_func(desktop->type_data); } } +#endif /** * @param desktop: The desktop file to save @@ -477,6 +552,7 @@ efreet_desktop_save(Efreet_Desktop *desktop) efreet_ini_string_set(ini, "Version", DESKTOP_VERSION); if (!efreet_ini_save(ini, desktop->orig_path)) ok = 0; +#if 0 else { if (desktop != eina_hash_find(efreet_desktop_cache, desktop->orig_path)) @@ -487,6 +563,7 @@ efreet_desktop_save(Efreet_Desktop *desktop) desktop); } } +#endif } efreet_ini_free(ini); return ok; @@ -501,7 +578,8 @@ efreet_desktop_save(Efreet_Desktop *desktop) EAPI int efreet_desktop_save_as(Efreet_Desktop *desktop, const char *file) { - if (desktop == eina_hash_find(efreet_desktop_cache, desktop->orig_path)) + if (desktop->cached && efreet_desktop_cache && + desktop == eina_hash_find(efreet_desktop_cache, desktop->orig_path)) { desktop->cached = 0; eina_hash_del(efreet_desktop_cache, desktop->orig_path, NULL); @@ -520,8 +598,6 @@ efreet_desktop_save_as(Efreet_Desktop *desktop, const char *file) EAPI void efreet_desktop_free(Efreet_Desktop *desktop) { - char *str; - if (!desktop) return; desktop->ref--; @@ -530,36 +606,49 @@ efreet_desktop_free(Efreet_Desktop *desktop) if (desktop->cached && efreet_desktop_cache) eina_hash_del(efreet_desktop_cache, desktop->orig_path, NULL); - IF_FREE(desktop->orig_path); - - IF_FREE(desktop->version); - IF_FREE(desktop->name); - IF_FREE(desktop->generic_name); - IF_FREE(desktop->comment); - IF_FREE(desktop->icon); - IF_FREE(desktop->url); - - IF_FREE(desktop->try_exec); - IF_FREE(desktop->exec); - IF_FREE(desktop->path); - IF_FREE(desktop->startup_wm_class); - - IF_FREE_LIST(desktop->only_show_in, free); - IF_FREE_LIST(desktop->not_show_in, free); - - EINA_LIST_FREE(desktop->categories, str) - eina_stringshare_del(str); - EINA_LIST_FREE(desktop->mime_types, str) - eina_stringshare_del(str); - - IF_FREE_HASH(desktop->x); - - if (desktop->type_data) + if (desktop->eet) { - Efreet_Desktop_Type_Info *info; - info = eina_list_nth(efreet_desktop_types, desktop->type); - if (info->free_func) - info->free_func(desktop->type_data); + eina_list_free(desktop->only_show_in); + eina_list_free(desktop->not_show_in); + eina_list_free(desktop->categories); + eina_list_free(desktop->mime_types); + IF_FREE_HASH(desktop->x); + } + else + { + char *str; + + IF_FREE(desktop->orig_path); + + IF_FREE(desktop->version); + IF_FREE(desktop->name); + IF_FREE(desktop->generic_name); + IF_FREE(desktop->comment); + IF_FREE(desktop->icon); + IF_FREE(desktop->url); + + IF_FREE(desktop->try_exec); + IF_FREE(desktop->exec); + IF_FREE(desktop->path); + IF_FREE(desktop->startup_wm_class); + + IF_FREE_LIST(desktop->only_show_in, free); + IF_FREE_LIST(desktop->not_show_in, free); + + EINA_LIST_FREE(desktop->categories, str) + eina_stringshare_del(str); + EINA_LIST_FREE(desktop->mime_types, str) + eina_stringshare_del(str); + + IF_FREE_HASH(desktop->x); + + if (desktop->type_data) + { + Efreet_Desktop_Type_Info *info; + info = eina_list_nth(efreet_desktop_types, desktop->type); + if (info->free_func) + info->free_func(desktop->type_data); + } } FREE(desktop); @@ -837,19 +926,6 @@ efreet_desktop_string_list_join(Eina_List *list) return string; } -/** - * @brief Tell Efreet to flush any cached desktop entries so it reloads on get. - * - * This flags the cache to be invalid, so next time a desktop file is fetched - * it will force it to be re-read off disk next time efreet_desktop_get() is - * called. - */ -EAPI void -efreet_desktop_cache_flush(void) -{ - cache_flush++; -} - /** * @internal * @param desktop: the Efreet_Desktop to store parsed fields in @@ -1881,3 +1957,50 @@ efreet_desktop_x_field_del(Efreet_Desktop *desktop, const char *key) return eina_hash_del(desktop->x, key, NULL); } + +/* + * Needs EAPI because of helper binaries + */ +EAPI Eet_Data_Descriptor * +efreet_desktop_edd_init(void) +{ + Eet_Data_Descriptor *edd; + + Eet_Data_Descriptor_Class eddc; + if (!eet_eina_file_data_descriptor_class_set(&eddc, "cache", sizeof(Efreet_Desktop))) return NULL; + edd = eet_data_descriptor_file_new(&eddc); + if (!edd) return NULL; + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "type", type, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "version", version, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "orig_path", orig_path, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "load_time", load_time, EET_T_LONG_LONG); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "name", name, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "generic_name", generic_name, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "comment", comment, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "icon", icon, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "try_exec", try_exec, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "exec", exec, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "path", path, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "startup_wm_class", startup_wm_class, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "url", url, EET_T_STRING); + eet_data_descriptor_element_add(edd, "only_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, only_show_in), 0, NULL, NULL); + eet_data_descriptor_element_add(edd, "not_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, not_show_in), 0, NULL, NULL); + eet_data_descriptor_element_add(edd, "categories", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, categories), 0, NULL, NULL); + eet_data_descriptor_element_add(edd, "mime_types", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Desktop, mime_types), 0, NULL, NULL); + eet_data_descriptor_element_add(edd, "x", EET_T_STRING, EET_G_HASH, offsetof(Efreet_Desktop, x), 0, NULL, NULL); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "no_display", no_display, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "hidden", hidden, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "terminal", terminal, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(edd, Efreet_Desktop, "startup_notify", startup_notify, EET_T_UCHAR); + return edd; +} + +/* + * Needs EAPI because of helper binaries + */ +EAPI void +efreet_desktop_edd_shutdown(Eet_Data_Descriptor *edd) +{ + eet_data_descriptor_free(edd); +} + diff --git a/legacy/efreet/src/lib/efreet_desktop.h b/legacy/efreet/src/lib/efreet_desktop.h index b6394dbe6d..44d907eea8 100644 --- a/legacy/efreet/src/lib/efreet_desktop.h +++ b/legacy/efreet/src/lib/efreet_desktop.h @@ -57,7 +57,6 @@ struct _Efreet_Desktop int type; /**< type of desktop file */ int ref; /**< reference count - internal */ - int cache_flush; /**< cache flush value - internal */ char *version; /**< version of spec file conforms to */ @@ -82,11 +81,12 @@ struct _Efreet_Desktop Eina_List *categories; /**< Categories in which item should be shown */ Eina_List *mime_types; /**< The mime types supppored by this app */ - unsigned char no_display:1; /**< Don't display this application in menus */ - unsigned char hidden:1; /**< User delete the item */ - unsigned char terminal:1; /**< Does the program run in a terminal */ - unsigned char startup_notify:1; /**< The starup notify settings of the app */ - unsigned char cached:1; /**< The desktop file is cached by Efreet */ + unsigned char no_display; /**< Don't display this application in menus */ + unsigned char hidden; /**< User delete the item */ + unsigned char terminal; /**< Does the program run in a terminal */ + unsigned char startup_notify; /**< The starup notify settings of the app */ + unsigned char cached:1; /**< The desktop file is cached by Efreet */ + unsigned char eet:1; /**< The desktop file is in eet cache */ Eina_Hash *x; /**< Keep track of all user extensions, keys that begin with X- */ void *type_data; /**< Type specific data for custom types */ @@ -97,6 +97,7 @@ EAPI int efreet_desktop_ref(Efreet_Desktop *desktop); EAPI Efreet_Desktop *efreet_desktop_empty_new(const char *file); EAPI Efreet_Desktop *efreet_desktop_new(const char *file); EAPI void efreet_desktop_free(Efreet_Desktop *desktop); +#define efreet_desktop_unref(desktop) efreet_desktop_free((desktop)) EAPI int efreet_desktop_save(Efreet_Desktop *desktop); EAPI int efreet_desktop_save_as(Efreet_Desktop *desktop, @@ -140,8 +141,6 @@ EAPI Eina_Bool efreet_desktop_x_field_set(Efreet_Desktop *desktop, const EAPI const char * efreet_desktop_x_field_get(Efreet_Desktop *desktop, const char *key); EAPI Eina_Bool efreet_desktop_x_field_del(Efreet_Desktop *desktop, const char *key); -EAPI void efreet_desktop_cache_flush(void); - /** * @} */ diff --git a/legacy/efreet/src/lib/efreet_icon.c b/legacy/efreet/src/lib/efreet_icon.c index 828b693ca7..0afc2acb76 100644 --- a/legacy/efreet/src/lib/efreet_icon.c +++ b/legacy/efreet/src/lib/efreet_icon.c @@ -87,7 +87,9 @@ static int efreet_icon_theme_cache_check_dir(Efreet_Icon_Theme *theme, const char *dir); static int efreet_icon_cache_find(Efreet_Icon_Cache *value, const char *key); +#if 0 static void efreet_icon_cache_flush(Efreet_Icon_Theme *theme, Eina_List *list); +#endif static void efreet_icon_cache_free(Efreet_Icon_Cache *value); static char *efreet_icon_cache_check(Efreet_Icon_Theme *theme, const char *icon, unsigned int size); static void efreet_icon_cache_add(Efreet_Icon_Theme *theme, const char *icon, unsigned int size, const char *value); @@ -1537,6 +1539,7 @@ efreet_icon_cache_find(Efreet_Icon_Cache *value, const char *key) return strcmp(value->key, key); } +#if 0 static void efreet_icon_cache_flush(Efreet_Icon_Theme *theme, Eina_List *list) { @@ -1557,6 +1560,7 @@ efreet_icon_cache_flush(Efreet_Icon_Theme *theme, Eina_List *list) eina_hash_modify(efreet_icon_cache, theme, list); } +#endif static void efreet_icon_cache_free(Efreet_Icon_Cache *value) diff --git a/legacy/efreet/src/lib/efreet_ini.c b/legacy/efreet/src/lib/efreet_ini.c index 7d4482c349..183b997857 100644 --- a/legacy/efreet/src/lib/efreet_ini.c +++ b/legacy/efreet/src/lib/efreet_ini.c @@ -278,6 +278,13 @@ next_line: munmap((char*) buffer, file_stat.st_size); fclose(f); +#if 0 + if (!eina_hash_population(data)) + { + eina_hash_free(data); + return NULL; + } +#endif return data; } diff --git a/legacy/efreet/src/lib/efreet_menu.c b/legacy/efreet/src/lib/efreet_menu.c index 057b07df0e..94955a729b 100644 --- a/legacy/efreet/src/lib/efreet_menu.c +++ b/legacy/efreet/src/lib/efreet_menu.c @@ -221,7 +221,7 @@ struct Efreet_Menu_Desktop unsigned char allocated:1; /**< If this desktop has been allocated */ }; -static char *efreet_menu_prefix = NULL; /**< The $XDG_MENU_PREFIX env var */ +static const char *efreet_menu_prefix = NULL; /**< The $XDG_MENU_PREFIX env var */ Eina_List *efreet_menu_kde_legacy_dirs = NULL; /**< The directories to use for KDELegacy entries */ static const char *efreet_tag_menu = NULL; static char *efreet_menu_file = NULL; /**< A menu file set explicityl as default */ @@ -580,7 +580,6 @@ efreet_menu_kde_legacy_init(void) void efreet_menu_shutdown(void) { - IF_FREE(efreet_menu_prefix); IF_FREE(efreet_menu_file); IF_FREE_HASH(efreet_menu_handle_cbs); @@ -978,8 +977,10 @@ efreet_menu_dump(Efreet_Menu *menu, const char *indent) * @return Returns the list of directories * @brief Creates the list of directories based on the user * dir, system dirs and given suffix. + * + * Needs EAPI because of helper binaries */ -Eina_List * +EAPI Eina_List * efreet_default_dirs_get(const char *user_dir, Eina_List *system_dirs, const char *suffix) { @@ -1063,13 +1064,10 @@ efreet_menu_internal_free(Efreet_Menu_Internal *internal) static const char * efreet_menu_prefix_get(void) { - char *prefix; - if (efreet_menu_prefix) return efreet_menu_prefix; - prefix = getenv("XDG_MENU_PREFIX"); - if (prefix) efreet_menu_prefix = strdup(prefix); - else efreet_menu_prefix = strdup(""); + efreet_menu_prefix = getenv("XDG_MENU_PREFIX"); + if (!efreet_menu_prefix) efreet_menu_prefix = ""; return efreet_menu_prefix; } diff --git a/legacy/efreet/src/lib/efreet_private.h b/legacy/efreet/src/lib/efreet_private.h index 88c125a3bf..fbb0609b76 100644 --- a/legacy/efreet/src/lib/efreet_private.h +++ b/legacy/efreet/src/lib/efreet_private.h @@ -2,6 +2,8 @@ #ifndef EFREET_PRIVATE_H #define EFREET_PRIVATE_H +#include + /** * @file efreet_private.h * @brief Contains methods and defines that are private to the Efreet @@ -177,9 +179,9 @@ void efreet_icon_shutdown(void); int efreet_menu_init(void); void efreet_menu_shutdown(void); -Eina_List *efreet_default_dirs_get(const char *user_dir, - Eina_List *system_dirs, - const char *suffix); +EAPI Eina_List *efreet_default_dirs_get(const char *user_dir, + Eina_List *system_dirs, + const char *suffix); int efreet_ini_init(void); void efreet_ini_shutdown(void); @@ -187,16 +189,22 @@ void efreet_ini_shutdown(void); int efreet_desktop_init(void); void efreet_desktop_shutdown(void); -const char *efreet_home_dir_get(void); +EAPI const char *efreet_home_dir_get(void); -EAPI const char *efreet_lang_get(void); -EAPI const char *efreet_lang_country_get(void); -EAPI const char *efreet_lang_modifier_get(void); +const char *efreet_lang_get(void); +const char *efreet_lang_country_get(void); +const char *efreet_lang_modifier_get(void); size_t efreet_array_cat(char *buffer, size_t size, const char *strs[]); const char *efreet_desktop_environment_get(void); +EAPI Eet_Data_Descriptor *efreet_desktop_edd_init(void); +EAPI void efreet_desktop_edd_shutdown(Eet_Data_Descriptor *edd); + +EAPI const char *efreet_util_cache_file(void); +EAPI const char *efreet_desktop_cache_file(void); + #define NON_EXISTING (void *)-1 /** diff --git a/legacy/efreet/src/lib/efreet_utils.c b/legacy/efreet/src/lib/efreet_utils.c index 4ef942b9f6..5f2d44441a 100644 --- a/legacy/efreet/src/lib/efreet_utils.c +++ b/legacy/efreet/src/lib/efreet_utils.c @@ -17,30 +17,12 @@ #include "Efreet.h" #include "efreet_private.h" -typedef struct Efreet_Cache_Fill Efreet_Cache_Fill; -typedef struct Efreet_Cache_Fill_Dir Efreet_Cache_Fill_Dir; typedef struct Efreet_Cache_Search Efreet_Cache_Search; typedef struct Efreet_Cache_Search_List Efreet_Cache_Search_List; -typedef struct Efreet_Monitor Efreet_Monitor; -typedef struct Efreet_Util_Desktop Efreet_Util_Desktop; - -struct Efreet_Cache_Fill -{ - Eina_List *dirs; - Efreet_Cache_Fill_Dir *current; - DIR *files; -}; - -struct Efreet_Cache_Fill_Dir -{ - char *path; - char *file_id; - int priority; -}; struct Efreet_Cache_Search { - Efreet_Util_Desktop *result; + Efreet_Desktop *result; const char *what1; const char *what2; }; @@ -51,19 +33,6 @@ struct Efreet_Cache_Search_List const char *what; }; -struct Efreet_Monitor -{ - char *file_id; - Ecore_File_Monitor *monitor; - int priority; -}; - -struct Efreet_Util_Desktop -{ - Efreet_Desktop *desktop; - int priority; -}; - /* define macros and variable for using the eina logging system */ #ifdef EFREET_MODULE_LOG_DOM @@ -74,135 +43,85 @@ static int _efreet_utils_log_dom = -1; static char *efreet_util_path_in_default(const char *section, const char *path); -static int efreet_util_cache_fill(void *data); -static void efreet_util_cache_add(const char *path, const char *file_id, int priority, int event); -static void efreet_util_cache_remove(const char *path, const char *file_id, int priority); -static void efreet_util_cache_reload(const char *path, const char *file_id, int priority); -static void efreet_util_cache_dir_free(void *data); - -static Eina_Bool efreet_util_cache_search_mime(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_wm_class(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_exec(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_name(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_generic_name(const Eina_Hash *hash, void *value, void *fdata); - -static Eina_Bool efreet_util_cache_search_name_glob(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_exec_glob(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_generic_name_glob(const Eina_Hash *hash, void *value, void *fdata); -static Eina_Bool efreet_util_cache_search_comment_glob(const Eina_Hash *hash, void *value, void *fdata); - static int efreet_util_glob_match(const char *str, const char *glob); -static void efreet_util_monitor(const char *path, const char *file_id, int priority); -static void efreet_util_monitor_cb(void *data, Ecore_File_Monitor *monitor, - Ecore_File_Event event, const char *path); -static void efreet_util_monitor_free(void *data); static void efreet_util_menus_find_helper(Eina_List *menus, const char *config_dir); -static void efreet_util_desktops_by_category_add(Efreet_Desktop *desktop); -static void efreet_util_desktops_by_category_remove(Efreet_Desktop *desktop); +static Efreet_Desktop *efreet_util_cache_find(const char *search, const char *what1, const char *what2); +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 void efreet_util_desktop_free(Efreet_Util_Desktop *ud); -static void efreet_event_desktop_change_free(void *data, void *ev); - -static Eina_Hash *desktop_by_file_id = NULL; static Eina_Hash *file_id_by_desktop_path = NULL; -static Eina_Hash *desktops_by_category = NULL; - -static Ecore_Idler *idler = NULL; -static Efreet_Cache_Fill *fill = NULL; - -static Eina_List *monitors = NULL; +static char *cache_file = NULL; +static Eet_File *cache = NULL; static int init = 0; -EAPI int EFREET_EVENT_DESKTOP_LIST_CHANGE = 0; -EAPI int EFREET_EVENT_DESKTOP_CHANGE = 0; - EAPI int efreet_util_init(void) { - Eina_List *dirs; - if (init++) return init; _efreet_utils_log_dom = eina_log_domain_register("Efreet_util",EFREET_DEFAULT_LOG_COLOR); if (_efreet_utils_log_dom < 0) { ERROR("Efreet: Could not create a log domain for efreet_util"); - return 0; + goto log_error; } - if (!EFREET_EVENT_DESKTOP_LIST_CHANGE) - EFREET_EVENT_DESKTOP_LIST_CHANGE = ecore_event_type_new(); - if (!EFREET_EVENT_DESKTOP_CHANGE) - EFREET_EVENT_DESKTOP_CHANGE = ecore_event_type_new(); - desktop_by_file_id = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_util_desktop_free)); + + /* TODO: Need file monitor on cache in case it is updated */ + cache = eet_open(efreet_util_cache_file(), EET_FILE_MODE_READ); + if (!cache) goto cache_error; file_id_by_desktop_path = eina_hash_string_superfast_new(EINA_FREE_CB(eina_stringshare_del)); - desktops_by_category = eina_hash_string_superfast_new(EINA_FREE_CB(eina_list_free)); - monitors = NULL; - - fill = NEW(Efreet_Cache_Fill, 1); - dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), - "applications"); - if (dirs) - { - Efreet_Cache_Fill_Dir *dir; - char *path; - int priority = 0; - - while (dirs) - { - path = eina_list_data_get(dirs); - dir = NEW(Efreet_Cache_Fill_Dir, 1); - dir->path = path; - dir->priority = priority++; - fill->dirs = eina_list_append(fill->dirs, dir); - dirs = eina_list_remove_list(dirs, dirs); - } - } - idler = ecore_idler_add(efreet_util_cache_fill, NULL); return init; + +cache_error: + eina_log_domain_unregister(_efreet_utils_log_dom); +log_error: + return 0; } EAPI int efreet_util_shutdown(void) { - Efreet_Monitor *em; - Efreet_Cache_Fill_Dir *dir; - if (--init) return init; - if (idler) - { - ecore_idler_del(idler); - while (fill->dirs) - { - dir = eina_list_data_get(fill->dirs); - efreet_util_cache_dir_free(dir); - fill->dirs = eina_list_remove_list(fill->dirs, fill->dirs); - } - - if (fill->current) efreet_util_cache_dir_free(fill->current); - if (fill->files) closedir(fill->files); - free(fill); - } - idler = NULL; - - IF_FREE_HASH(desktop_by_file_id); - IF_FREE_HASH(file_id_by_desktop_path); - - while (monitors) - { - em = eina_list_data_get(monitors); - efreet_util_monitor_free(em); - monitors = eina_list_remove_list(monitors, monitors); - } - - IF_FREE_HASH(desktops_by_category); eina_log_domain_unregister(_efreet_utils_log_dom); + IF_FREE_HASH(file_id_by_desktop_path); + if (cache) eet_close(cache); + IF_FREE(cache_file); return init; } +/* + * Needs EAPI because of helper binaries + */ +EAPI const char * +efreet_util_cache_file(void) +{ + char tmp[PATH_MAX] = { '\0' }; + const char *home, *lang, *country, *modifier; + + if (cache_file) return cache_file; + + home = efreet_home_dir_get(); + lang = efreet_lang_get(); + country = efreet_lang_country_get(); + modifier = efreet_lang_modifier_get(); + + if (lang && country && modifier) + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_util_%s_%s@%s.cache", home, lang, country, modifier); + else if (lang && country) + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_util_%s_%s.cache", home, lang, country); + else if (lang) + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_util_%s.cache", home, lang); + else + snprintf(tmp, sizeof(tmp), "%s/.efreet/desktop_util.cache", home); + + cache_file = strdup(tmp); + return cache_file; +} + static char * efreet_util_path_in_default(const char *section, const char *path) { @@ -216,16 +135,11 @@ efreet_util_path_in_default(const char *section, const char *path) EINA_LIST_FREE(dirs, dir) { if (!strncmp(path, dir, strlen(dir))) - { ret = dir; - break; - } - free(dir); + else + free(dir); } - EINA_LIST_FREE(dirs, dir) - if (ret != dir) free(dir); - return ret; } @@ -235,8 +149,9 @@ efreet_util_path_to_file_id(const char *path) size_t len; char *tmp, *p; char *base; - const char *file_id = NULL; + const char *file_id; + /* TODO: Check if searching in cache is fast enough */ if (!path) return NULL; file_id = eina_hash_find(file_id_by_desktop_path, path); if (file_id) return file_id; @@ -274,243 +189,133 @@ efreet_util_path_to_file_id(const char *path) EAPI Eina_List * efreet_util_desktop_mime_list(const char *mime) { - Efreet_Cache_Search_List search; - Eina_Iterator *it; - - search.list = NULL; - search.what = eina_stringshare_add(mime); - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_mime), &search); - eina_iterator_free(it); - - eina_stringshare_del(search.what); - - return search.list; + return efreet_util_cache_list("*::m", mime); } EAPI Efreet_Desktop * efreet_util_desktop_wm_class_find(const char *wmname, const char *wmclass) { - Efreet_Cache_Search search; - Efreet_Util_Desktop *ud; - Eina_Iterator *it; - - if ((!wmname) && (!wmclass)) return NULL; - search.what1 = wmname; - search.what2 = wmclass; - search.result = NULL; - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_wm_class), &search); - eina_iterator_free(it); - ud = search.result; - - if (ud) - { - efreet_desktop_ref(ud->desktop); - return ud->desktop; - } - return NULL; + return efreet_util_cache_find("*::swc", wmname, wmclass); } EAPI Efreet_Desktop * efreet_util_desktop_file_id_find(const char *file_id) { - Efreet_Desktop *desktop = NULL; - Efreet_Util_Desktop *ud = NULL; - Eina_List *dirs, *l; - const char *dir; - int priority = 0; - - if (!file_id) return NULL; - ud = eina_hash_find(desktop_by_file_id, file_id); - if (ud) return ud->desktop; - - dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), - "applications"); - if (!dirs) return NULL; - - EINA_LIST_FOREACH(dirs, l, dir) - { - char *tmp, *p; - char buf[PATH_MAX]; - - tmp = strdup(file_id); - p = tmp; - - while (p) - { - snprintf(buf, sizeof(buf), "%s/%s", dir, tmp); - desktop = efreet_desktop_get(buf); - if (desktop) break; - p = strchr(p, '-'); - if (p) *p = '/'; - } - free(tmp); - if (desktop) break; - priority++; - } - while (dirs) - { - free(eina_list_data_get(dirs)); - dirs = eina_list_remove_list(dirs, dirs); - } - if (desktop) - { - Efreet_Event_Desktop_Change *ev; - - ud = NEW(Efreet_Util_Desktop, 1); - ud->priority = priority; - ud->desktop = desktop; - - eina_hash_del(desktop_by_file_id, file_id, NULL); - eina_hash_add(desktop_by_file_id, file_id, ud); - efreet_util_desktops_by_category_add(desktop); - - ev = NEW(Efreet_Event_Desktop_Change, 1); - ev->current = desktop; - efreet_desktop_ref(ev->current); - ev->change = EFREET_DESKTOP_CHANGE_ADD; - ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); - } - return desktop; + return efreet_util_cache_find("*::fi", file_id, NULL); } EAPI Efreet_Desktop * efreet_util_desktop_exec_find(const char *exec) { - Efreet_Cache_Search search; - Eina_Iterator *it; + char **keys; + int num, i; + Efreet_Desktop *ret = NULL; if (!exec) return NULL; - search.what1 = exec; - search.what2 = NULL; - search.result = NULL; - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_exec), &search); - eina_iterator_free(it); + keys = eet_list(cache, "*::e", &num); + if (!keys) return NULL; + for (i = 0; i < num; i++) + { + const char *data, *file; + char *exe; + int size, id; + char key[PATH_MAX]; - if (!search.result) return NULL; + data = eet_read_direct(cache, keys[i], &size); + if (!data) continue; + exe = ecore_file_app_exe_get(data); + if (!exe) continue; + file = ecore_file_file_get(exe); + if (!file) continue; + if (strcmp(exec, exe) && strcmp(exec, file)) + { + free(exe); + continue; + } + free(exe); - efreet_desktop_ref(search.result->desktop); - return search.result->desktop; + id = atoi(keys[i]); + snprintf(key, sizeof(key), "%d::op", id); + data = eet_read_direct(cache, key, &size); + if (!data) continue; + ret = efreet_desktop_get(data); + if (ret) break; + } + free(keys); + return ret; } EAPI Efreet_Desktop * efreet_util_desktop_name_find(const char *name) { - Efreet_Cache_Search search; - Eina_Iterator *it; - - if (!name) return NULL; - search.what1 = name; - search.what2 = NULL; - search.result = NULL; - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_name), &search); - eina_iterator_free(it); - - if (!search.result) return NULL; - - efreet_desktop_ref(search.result->desktop); - return search.result->desktop; + return efreet_util_cache_find("*::n", name, NULL); } EAPI Efreet_Desktop * efreet_util_desktop_generic_name_find(const char *generic_name) { - Efreet_Cache_Search search; - Eina_Iterator *it; - - if (!generic_name) return NULL; - search.what1 = generic_name; - search.what2 = NULL; - search.result = NULL; - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_generic_name), &search); - eina_iterator_free(it); - - if (!search.result) return NULL; - - efreet_desktop_ref(search.result->desktop); - return search.result->desktop; + return efreet_util_cache_find("*::gn", generic_name, NULL); } EAPI Eina_List * efreet_util_desktop_name_glob_list(const char *glob) { - Efreet_Cache_Search_List search; - Eina_Iterator *it; - - search.list = NULL; - search.what = glob; - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_name_glob), &search); - eina_iterator_free(it); - - return search.list; + return efreet_util_cache_glob_list("*::n", glob); } EAPI Eina_List * efreet_util_desktop_exec_glob_list(const char *glob) { - Efreet_Cache_Search_List search; - Eina_Iterator *it; + char **keys; + int num, i; + Eina_List *ret = NULL; - search.list = NULL; - search.what = glob; + if (!glob) return NULL; - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_exec_glob), &search); - eina_iterator_free(it); + keys = eet_list(cache, "*::e", &num); + if (!keys) return NULL; + for (i = 0; i < num; i++) + { + const char *data; + char *exe; + int size, id; + char key[PATH_MAX]; + Efreet_Desktop *desk; - return search.list; + data = eet_read_direct(cache, keys[i], &size); + if (!data) continue; + exe = ecore_file_app_exe_get(data); + if (!exe) continue; + if (!efreet_util_glob_match(exe, glob)) + { + free(exe); + continue; + } + free(exe); + + id = atoi(keys[i]); + snprintf(key, sizeof(key), "%d::op", id); + data = eet_read_direct(cache, key, &size); + if (!data) continue; + desk = efreet_desktop_get(data); + if (desk) + ret = eina_list_append(ret, desk); + } + free(keys); + return ret; } EAPI Eina_List * efreet_util_desktop_generic_name_glob_list(const char *glob) { - Efreet_Cache_Search_List search; - Eina_Iterator *it; - - search.list = NULL; - search.what = glob; - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_generic_name_glob), &search); - eina_iterator_free(it); - - return search.list; + return efreet_util_cache_glob_list("*::gn", glob); } EAPI Eina_List * efreet_util_desktop_comment_glob_list(const char *glob) { - Efreet_Cache_Search_List search; - Eina_Iterator *it; - - search.list = NULL; - search.what = glob; - - it = eina_hash_iterator_data_new(desktop_by_file_id); - eina_iterator_foreach(it, EINA_EACH(efreet_util_cache_search_comment_glob), &search); - eina_iterator_free(it); - - return search.list; -} - -static Eina_Bool -_hash_keys(Eina_Hash *hash __UNUSED__, const void *key, void *fdata) -{ - Eina_List **l = fdata; - - *l = eina_list_append(*l, key); - return EINA_TRUE; + return efreet_util_cache_glob_list("*::co", glob); } /** @@ -522,506 +327,36 @@ _hash_keys(Eina_Hash *hash __UNUSED__, const void *key, void *fdata) EAPI Eina_List * efreet_util_desktop_categories_list(void) { - Eina_Iterator *it; - Eina_List *list = NULL; + char **keys; + int num, i; + Eina_List *ret = NULL; - it = eina_hash_iterator_key_new(desktops_by_category); - if (it) + keys = eet_list(cache, "*::ca", &num); + if (!keys) return NULL; + for (i = 0; i < num; i++) { - eina_iterator_foreach(it, EINA_EACH(_hash_keys), &list); - eina_iterator_free(it); - } + const char *data; + int size; - return list; + data = eet_read_direct(cache, keys[i], &size); + if (!data) continue; + if (eina_list_search_unsorted(ret, EINA_COMPARE_CB(strcmp), data)) continue; + ret = eina_list_append(ret, data); + } + free(keys); + return ret; } /** * Find all desktops in a given category * - * Note: this returns a pointer to an internal list. Do not add to, remove from, or delete this list. - * * @param category the category name * @return a list of desktops */ EAPI Eina_List * efreet_util_desktop_category_list(const char *category) { - return eina_hash_find(desktops_by_category, category); -} - -#if 0 -static Eina_Bool -dump(Eina_Hash *hash, const char *key, void *value, __UNUSED__ void *data) -{ - INF("%s -> %p", (char *)key, value); -} -#endif - -static int -efreet_util_cache_fill(__UNUSED__ void *data) -{ - Efreet_Cache_Fill_Dir *dir; - struct dirent *file = NULL; - double start; - char buf[PATH_MAX]; - - if ((!fill->dirs) && (!fill->files)) - { - free(fill); - idler = NULL; - fill = NULL; - ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL); - - return 0; - } - if (!fill->current) - { - fill->current = eina_list_data_get(fill->dirs); - fill->dirs = eina_list_remove_list(fill->dirs, fill->dirs); - if (!fill->current) - { - while (fill->dirs) - { - dir = eina_list_data_get(fill->dirs); - efreet_util_cache_dir_free(dir); - fill->dirs = eina_list_remove_list(fill->dirs, fill->dirs); - } - - free(fill); - idler = NULL; - fill = NULL; -#if 0 - eina_hash_foreach(desktop_by_file_id, dump, NULL); - eina_hash_foreach(file_id_by_desktop_path, dump, NULL); - DBG("%d", eina_hash_population(desktop_by_file_id)); -#endif - ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL); - - return 0; - } - } - - start = ecore_time_get(); - if (!fill->files) - { - fill->files = opendir(fill->current->path); - } - if (!fill->files) - { - /* Couldn't open this dir, continue to next */ - efreet_util_cache_dir_free(fill->current); - fill->current = NULL; - } - else - { - do - { - char file_id[PATH_MAX]; - - file = readdir(fill->files); - if (!file) break; - if (!strcmp(file->d_name, ".") || !strcmp(file->d_name, "..")) continue; - - snprintf(buf, sizeof(buf), "%s/%s", fill->current->path, file->d_name); - if (fill->current->file_id) - snprintf(file_id, sizeof(file_id), "%s-%s", fill->current->file_id, file->d_name); - else - strcpy(file_id, file->d_name); - - if (ecore_file_is_dir(buf)) - { - Efreet_Cache_Fill_Dir *dir; - - dir = NEW(Efreet_Cache_Fill_Dir, 1); - dir->path = strdup(buf); - dir->file_id = strdup(file_id); - dir->priority = fill->current->priority; - fill->dirs = eina_list_append(fill->dirs, dir); - } - else - efreet_util_cache_add(buf, file_id, fill->current->priority, 0); - } while ((ecore_time_get() - start) < 0.01); - - if (!file) - { - /* This dir has been search through */ - efreet_util_monitor(fill->current->path, fill->current->file_id, - fill->current->priority); - efreet_util_cache_dir_free(fill->current); - fill->current = NULL; - closedir(fill->files); - fill->files = NULL; - } - } - - return 1; -} - -static void -efreet_util_cache_add(const char *path, const char *file_id, int priority, int event) -{ - Efreet_Desktop *desktop; - Efreet_Util_Desktop *ud; - char *ext; - - ext = strrchr(path, '.'); - if (!ext || strcmp(ext, ".desktop")) return; - desktop = efreet_desktop_get(path); - - if (!desktop || desktop->type != EFREET_DESKTOP_TYPE_APPLICATION) - { - if (desktop) efreet_desktop_free(desktop); - return; - } - - if (!eina_hash_find(file_id_by_desktop_path, desktop->orig_path)) - { - eina_hash_add(file_id_by_desktop_path, - desktop->orig_path, - (void *)eina_stringshare_add(file_id)); - - } - - ud = eina_hash_find(desktop_by_file_id, file_id); - if (!ud) - { - ud = NEW(Efreet_Util_Desktop, 1); - ud->priority = priority; - ud->desktop = desktop; - - eina_hash_add(desktop_by_file_id, file_id, ud); - efreet_util_desktops_by_category_add(desktop); - - if (event) - { - Efreet_Event_Desktop_Change *ev; - - ev = NEW(Efreet_Event_Desktop_Change, 1); - ev->current = desktop; - efreet_desktop_ref(ev->current); - ev->change = EFREET_DESKTOP_CHANGE_ADD; - ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); - } - } - else if (priority < ud->priority) - { - efreet_util_desktops_by_category_remove(ud->desktop); - efreet_util_desktops_by_category_add(desktop); - - if (event) - { - Efreet_Event_Desktop_Change *ev; - - ev = NEW(Efreet_Event_Desktop_Change, 1); - ev->current = desktop; - efreet_desktop_ref(ev->current); - ev->previous = ud->desktop; - efreet_desktop_ref(ev->previous); - ev->change = EFREET_DESKTOP_CHANGE_UPDATE; - efreet_desktop_free(ud->desktop); - ud->desktop = desktop; - ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); - } - else - { - efreet_desktop_free(ud->desktop); - ud->desktop = desktop; - } - } - else - efreet_desktop_free(desktop); -} - -static void -efreet_util_cache_remove(const char *path, const char *file_id, int priority) -{ - Efreet_Util_Desktop *ud; - char *ext; - - ext = strrchr(path, '.'); - if (!ext || strcmp(ext, ".desktop")) return; - ud = eina_hash_find(desktop_by_file_id, file_id); - if (ud && (ud->priority >= priority)) - { - Efreet_Event_Desktop_Change *ev; - - efreet_util_desktops_by_category_remove(ud->desktop); - - ev = NEW(Efreet_Event_Desktop_Change, 1); - ev->current = ud->desktop; - efreet_desktop_ref(ev->current); - ev->change = EFREET_DESKTOP_CHANGE_REMOVE; - ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); - - eina_hash_del(desktop_by_file_id, file_id, ud); - - /* This call will search application dirs and add the file to cache if it - * exists. */ - efreet_util_desktop_file_id_find(file_id); - } - eina_hash_del(file_id_by_desktop_path, path, eina_hash_find(file_id_by_desktop_path, path)); -} - -static void -efreet_util_cache_reload(const char *path, const char *file_id, int priority) -{ - Efreet_Desktop *desktop; - Efreet_Util_Desktop *ud; - char *ext; - - ext = strrchr(path, '.'); - if (!ext || strcmp(ext, ".desktop")) return; - desktop = efreet_desktop_get(path); - - if (!desktop || desktop->type != EFREET_DESKTOP_TYPE_APPLICATION) - { - if (desktop) efreet_desktop_free(desktop); - return; - } - - ud = eina_hash_find(desktop_by_file_id, file_id); - if (ud) - { - Efreet_Event_Desktop_Change *ev; - - if (ud->priority < priority) - { - efreet_desktop_free(desktop); - return; - } - - efreet_util_desktops_by_category_remove(ud->desktop); - efreet_util_desktops_by_category_add(desktop); - - ev = NEW(Efreet_Event_Desktop_Change, 1); - ev->current = desktop; - efreet_desktop_ref(ev->current); - ev->previous = ud->desktop; - efreet_desktop_ref(ev->previous); - ev->change = EFREET_DESKTOP_CHANGE_UPDATE; - ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); - - efreet_desktop_free(ud->desktop); - ud->desktop = desktop; - } - else - { - Efreet_Event_Desktop_Change *ev; - - ud = NEW(Efreet_Util_Desktop, 1); - ud->priority = priority; - ud->desktop = desktop; - - eina_hash_add(desktop_by_file_id, file_id, ud); - efreet_util_desktops_by_category_remove(ud->desktop); - efreet_util_desktops_by_category_add(desktop); - - ev = NEW(Efreet_Event_Desktop_Change, 1); - ev->current = desktop; - efreet_desktop_ref(ev->current); - ev->change = EFREET_DESKTOP_CHANGE_ADD; - ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); - } -} - -static void -efreet_util_cache_dir_free(void *data) -{ - Efreet_Cache_Fill_Dir *dir; - - dir = data; - IF_FREE(dir->path); - IF_FREE(dir->file_id); - free(dir); -} - -static Eina_Bool -efreet_util_cache_search_mime(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search_List *search; - Efreet_Util_Desktop *ud; - Eina_List *l; - const char *mime; - - search = fdata; - ud = value; - - if (!ud->desktop->mime_types) return EINA_TRUE; - EINA_LIST_FOREACH(ud->desktop->mime_types, l, mime) - if (search->what == mime) - { - efreet_desktop_ref(ud->desktop); - search->list = eina_list_append(search->list, ud->desktop); - break; - } - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_wm_class(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search *search; - Efreet_Util_Desktop *ud; - - ud = value; - search = fdata; - - if (!ud->desktop) return EINA_TRUE; - if (!ud->desktop->startup_wm_class) return EINA_TRUE; - if ((search->what2) && (!strcmp(ud->desktop->startup_wm_class, search->what2))) - { - search->result = ud; - return EINA_FALSE; - } - else if ((search->what1) && (!strcmp(ud->desktop->startup_wm_class, search->what1))) - { - search->result = ud; - return EINA_FALSE; - } - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_exec(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search *search; - Efreet_Util_Desktop *ud; - char *exec; - const char *file; - - ud = value; - search = fdata; - - if (!ud->desktop->exec) return EINA_TRUE; - exec = ecore_file_app_exe_get(ud->desktop->exec); - if (!exec) return EINA_TRUE; - if (!strcmp(exec, search->what1)) - { - free(exec); - search->result = ud; - return EINA_FALSE; - } - - file = ecore_file_file_get(exec); - if (file && !strcmp(file, search->what1)) - { - free(exec); - search->result = ud; - return EINA_FALSE; - } - free(exec); - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_name(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search *search; - Efreet_Util_Desktop *ud; - - ud = value; - search = fdata; - - if (!ud->desktop->name) return EINA_TRUE; - if (!strcmp(ud->desktop->name, search->what1)) - { - search->result = ud; - return EINA_FALSE; - } - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_generic_name(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search *search; - Efreet_Util_Desktop *ud; - - ud = value; - search = fdata; - - if (!ud->desktop->generic_name) return EINA_TRUE; - if (!strcmp(ud->desktop->generic_name, search->what1)) - { - search->result = ud; - return EINA_FALSE; - } - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_name_glob(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search_List *search; - Efreet_Util_Desktop *ud; - - search = fdata; - ud = value; - - if (!ud->desktop) return EINA_TRUE; - if (efreet_util_glob_match(ud->desktop->name, search->what)) - { - efreet_desktop_ref(ud->desktop); - search->list = eina_list_append(search->list, ud->desktop); - } - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_exec_glob(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search_List *search; - Efreet_Util_Desktop *ud; - char *exec; - - search = fdata; - ud = value; - - if (!ud->desktop->exec) return EINA_TRUE; - exec = ecore_file_app_exe_get(ud->desktop->exec); - if (!exec) return EINA_TRUE; - - if (efreet_util_glob_match(exec, search->what)) - { - efreet_desktop_ref(ud->desktop); - search->list = eina_list_append(search->list, ud->desktop); - } - free(exec); - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_generic_name_glob(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search_List *search; - Efreet_Util_Desktop *ud; - - search = fdata; - ud = value; - - if (efreet_util_glob_match(ud->desktop->generic_name, search->what)) - { - efreet_desktop_ref(ud->desktop); - search->list = eina_list_append(search->list, ud->desktop); - } - return EINA_TRUE; -} - -static Eina_Bool -efreet_util_cache_search_comment_glob(__UNUSED__ const Eina_Hash *hash, void *value, void *fdata) -{ - Efreet_Cache_Search_List *search; - Efreet_Util_Desktop *ud; - - search = fdata; - ud = value; - - if (efreet_util_glob_match(ud->desktop->comment, search->what)) - { - efreet_desktop_ref(ud->desktop); - search->list = eina_list_append(search->list, ud->desktop); - } - return EINA_TRUE; + return efreet_util_cache_list("*::ca", category); } static int @@ -1039,85 +374,6 @@ efreet_util_glob_match(const char *str, const char *glob) return 0; } -static void -efreet_util_monitor(const char *path, const char *file_id, int priority) -{ - Efreet_Monitor *em; - - em = NEW(Efreet_Monitor, 1); - em->monitor = ecore_file_monitor_add(path, efreet_util_monitor_cb, em); - if (file_id) em->file_id = strdup(file_id); - em->priority = priority; - monitors = eina_list_append(monitors, em); -} - -static void -efreet_util_monitor_cb(void *data, Ecore_File_Monitor *monitor __UNUSED__, - Ecore_File_Event event, const char *path) -{ - Efreet_Monitor *em; - char file_id[PATH_MAX]; - - em = data; - if (em->file_id) - snprintf(file_id, sizeof(file_id), "%s-%s", em->file_id, ecore_file_file_get(path)); - else - strcpy(file_id, ecore_file_file_get(path)); - switch (event) - { - case ECORE_FILE_EVENT_NONE: - /* Ignore */ - break; - case ECORE_FILE_EVENT_CREATED_FILE: - efreet_util_cache_add(path, file_id, em->priority, 1); - break; - case ECORE_FILE_EVENT_CREATED_DIRECTORY: - { - Efreet_Cache_Fill_Dir *dir; - - if (!fill) - { - fill = NEW(Efreet_Cache_Fill, 1); - } - - dir = NEW(Efreet_Cache_Fill_Dir, 1); - dir->path = strdup(path); - dir->file_id = strdup(file_id); - dir->priority = em->priority; - fill->dirs = eina_list_append(fill->dirs, dir); - - if (!idler) - idler = ecore_idler_add(efreet_util_cache_fill, NULL); - } - break; - case ECORE_FILE_EVENT_DELETED_FILE: - efreet_util_cache_remove(path, file_id, em->priority); - break; - case ECORE_FILE_EVENT_DELETED_DIRECTORY: - /* Ignore, we should already have a monitor on any subdir */ - break; - case ECORE_FILE_EVENT_DELETED_SELF: - if (eina_list_data_find(monitors, em)) - monitors = eina_list_remove(monitors, em); - efreet_util_monitor_free(em); - break; - case ECORE_FILE_EVENT_MODIFIED: - efreet_util_cache_reload(path, file_id, em->priority); - break; - } -} - -static void -efreet_util_monitor_free(void *data) -{ - Efreet_Monitor *em; - - em = data; - if (em->monitor) ecore_file_monitor_del(em->monitor); - IF_FREE(em->file_id); - free(em); -} - /** * Returns a list of .menu files found in the various config dirs. * @return An eina list of menu file paths (const char *). This must be freed with EINA_LIST_FREE. @@ -1162,68 +418,103 @@ efreet_util_menus_find_helper(Eina_List *menus, const char *config_dir) closedir(files); } -static void -efreet_util_desktops_by_category_add(Efreet_Desktop *desktop) +static Efreet_Desktop * +efreet_util_cache_find(const char *search, const char *what1, const char *what2) { - Eina_List *l; - const char *category; + char **keys; + int num, i; + Efreet_Desktop *ret = NULL; - if (!desktop->categories) return; + if ((!what1) && (!what2)) return NULL; - EINA_LIST_FOREACH(desktop->categories, l, category) + keys = eet_list(cache, search, &num); + if (!keys) return NULL; + for (i = 0; i < num; i++) { - Eina_List *list; - int newlist = 0; - list = eina_hash_find(desktops_by_category, category); - if (!list) newlist = 1; - if (!eina_list_data_find(list, desktop)) - list = eina_list_append(list, desktop); - if (newlist) - eina_hash_add(desktops_by_category, category, list); - else - eina_hash_modify(desktops_by_category, category, list); + const char *data; + int size, id; + char key[PATH_MAX]; + + data = eet_read_direct(cache, keys[i], &size); + if (!data) continue; + if (!((what1 && !strcmp(what1, data)) || + (what2 && !strcmp(what2, data)))) continue; + + id = atoi(keys[i]); + snprintf(key, sizeof(key), "%d::op", id); + data = eet_read_direct(cache, key, &size); + if (!data) continue; + ret = efreet_desktop_get(data); + if (ret) break; } + free(keys); + return ret; } -static void -efreet_util_desktops_by_category_remove(Efreet_Desktop *desktop) +static Eina_List * +efreet_util_cache_list(const char *search, const char *what) { - Eina_List *l; - const char *category; + char **keys; + int num, i; + Eina_List *ret = NULL; - if (!desktop->categories) return; + if (!what) return NULL; - EINA_LIST_FOREACH(desktop->categories, l, category) + keys = eet_list(cache, search, &num); + if (!keys) return NULL; + for (i = 0; i < num; i++) { - Eina_List *list; - list = eina_hash_find(desktops_by_category, category); - if (!list) continue; - if (eina_list_data_find(list, desktop)) - list = eina_list_remove(list, desktop); - if (!list) - eina_hash_del(desktops_by_category, category, list); - else - eina_hash_modify(desktops_by_category, category, list); + const char *data; + int size, id; + char key[PATH_MAX]; + Efreet_Desktop *desk; + + data = eet_read_direct(cache, keys[i], &size); + if (!data) continue; + if (strcmp(what, data)) continue; + + id = atoi(keys[i]); + snprintf(key, sizeof(key), "%d::op", id); + data = eet_read_direct(cache, key, &size); + if (!data) continue; + desk = efreet_desktop_get(data); + if (desk) + ret = eina_list_append(ret, desk); } + free(keys); + return ret; } -static void -efreet_util_desktop_free(Efreet_Util_Desktop *ud) +static Eina_List * +efreet_util_cache_glob_list(const char *search, const char *what) { - if (!ud) return; + char **keys; + int num, i; + Eina_List *ret = NULL; - efreet_desktop_free(ud->desktop); - free(ud); -} - -static void -efreet_event_desktop_change_free(void *data __UNUSED__, void *ev) -{ - Efreet_Event_Desktop_Change *event; - - event = ev; - if (event->current) efreet_desktop_free(event->current); - if (event->previous) efreet_desktop_free(event->previous); - - free(event); + if (!what) return NULL; + + keys = eet_list(cache, search, &num); + if (!keys) return NULL; + for (i = 0; i < num; i++) + { + const char *data; + int size, id; + char key[PATH_MAX]; + Efreet_Desktop *desk; + + data = eet_read_direct(cache, keys[i], &size); + if (!data) continue; + if (!efreet_util_glob_match(data, what)) continue; + + id = atoi(keys[i]); + snprintf(key, sizeof(key), "%d::op", id); + data = eet_read_direct(cache, key, &size); + if (!data) continue; + desk = efreet_desktop_get(data); + if (desk) + ret = eina_list_append(ret, desk); + } + free(keys); + return ret; } diff --git a/legacy/efreet/src/lib/efreet_utils.h b/legacy/efreet/src/lib/efreet_utils.h index a7c84871a4..ea6a905af5 100644 --- a/legacy/efreet/src/lib/efreet_utils.h +++ b/legacy/efreet/src/lib/efreet_utils.h @@ -2,22 +2,6 @@ #ifndef EFREET_UTILS_H #define EFREET_UTILS_H -typedef enum _Efreet_Desktop_Change -{ - EFREET_DESKTOP_CHANGE_ADD, - EFREET_DESKTOP_CHANGE_REMOVE, - EFREET_DESKTOP_CHANGE_UPDATE -} Efreet_Desktop_Change; - -typedef struct _Efreet_Event_Desktop_Change Efreet_Event_Desktop_Change; - -struct _Efreet_Event_Desktop_Change -{ - Efreet_Desktop *current; - Efreet_Desktop *previous; - Efreet_Desktop_Change change; -}; - EAPI int efreet_util_init(void); EAPI int efreet_util_shutdown(void); @@ -41,7 +25,4 @@ EAPI Eina_List *efreet_util_desktop_category_list(const char *category); EAPI Eina_List *efreet_util_menus_find(void); -EAPI extern int EFREET_EVENT_DESKTOP_LIST_CHANGE; -EAPI extern int EFREET_EVENT_DESKTOP_CHANGE; - #endif diff --git a/legacy/efreet/src/bin/.cvsignore b/legacy/efreet/src/tests/.cvsignore similarity index 100% rename from legacy/efreet/src/bin/.cvsignore rename to legacy/efreet/src/tests/.cvsignore diff --git a/legacy/efreet/src/tests/Makefile.am b/legacy/efreet/src/tests/Makefile.am new file mode 100644 index 0000000000..d2790fec3f --- /dev/null +++ b/legacy/efreet/src/tests/Makefile.am @@ -0,0 +1,43 @@ + +SUBDIRS = data compare + +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)\" \ +@EFREET_CFLAGS@ + +bin_PROGRAMS = efreet_test efreet_spec_test efreet_cache_test + +efreet_test_DEPENDENCIES = $(top_builddir)/src/lib/libefreet.la \ + $(top_builddir)/src/lib/libefreet_mime.la +efreet_test_LDADD = $(top_builddir)/src/lib/libefreet.la \ + $(top_builddir)/src/lib/libefreet_mime.la \ + @EFREET_LIBS@ +efreet_test_SOURCES = \ +ef_test.h \ +ef_data_dirs.c \ +ef_icon_theme.c \ +ef_ini.c \ +ef_utils.c \ +ef_desktop.c \ +ef_menu.c \ +ef_mime.c \ +main.c + +if DEFAULT_VISIBILITY +efreet_test_SOURCES += \ +ef_locale.c +endif + +efreet_spec_test_LDADD = $(top_builddir)/src/lib/libefreet.la @EINA_LIBS@ +efreet_spec_test_SOURCES = \ +efreet_spec_test.c + +efreet_cache_test_LDADD = $(top_builddir)/src/lib/libefreet.la @EFREET_LIBS@ +efreet_cache_test_SOURCES = \ +ef_cache.c diff --git a/legacy/efreet/src/bin/compare/.cvsignore b/legacy/efreet/src/tests/compare/.cvsignore similarity index 100% rename from legacy/efreet/src/bin/compare/.cvsignore rename to legacy/efreet/src/tests/compare/.cvsignore diff --git a/legacy/efreet/src/bin/compare/Makefile.am b/legacy/efreet/src/tests/compare/Makefile.am similarity index 100% rename from legacy/efreet/src/bin/compare/Makefile.am rename to legacy/efreet/src/tests/compare/Makefile.am diff --git a/legacy/efreet/src/bin/compare/comp.h b/legacy/efreet/src/tests/compare/comp.h similarity index 100% rename from legacy/efreet/src/bin/compare/comp.h rename to legacy/efreet/src/tests/compare/comp.h diff --git a/legacy/efreet/src/bin/compare/efreet_alloc.c b/legacy/efreet/src/tests/compare/efreet_alloc.c similarity index 100% rename from legacy/efreet/src/bin/compare/efreet_alloc.c rename to legacy/efreet/src/tests/compare/efreet_alloc.c diff --git a/legacy/efreet/src/bin/compare/efreet_menu_alloc.c b/legacy/efreet/src/tests/compare/efreet_menu_alloc.c similarity index 100% rename from legacy/efreet/src/bin/compare/efreet_menu_alloc.c rename to legacy/efreet/src/tests/compare/efreet_menu_alloc.c diff --git a/legacy/efreet/src/bin/data/.cvsignore b/legacy/efreet/src/tests/data/.cvsignore similarity index 100% rename from legacy/efreet/src/bin/data/.cvsignore rename to legacy/efreet/src/tests/data/.cvsignore diff --git a/legacy/efreet/src/bin/data/Makefile.am b/legacy/efreet/src/tests/data/Makefile.am similarity index 100% rename from legacy/efreet/src/bin/data/Makefile.am rename to legacy/efreet/src/tests/data/Makefile.am diff --git a/legacy/efreet/src/bin/data/entry b/legacy/efreet/src/tests/data/entry similarity index 100% rename from legacy/efreet/src/bin/data/entry rename to legacy/efreet/src/tests/data/entry diff --git a/legacy/efreet/src/bin/data/entry.png b/legacy/efreet/src/tests/data/entry.png similarity index 100% rename from legacy/efreet/src/bin/data/entry.png rename to legacy/efreet/src/tests/data/entry.png diff --git a/legacy/efreet/src/bin/data/long.ini b/legacy/efreet/src/tests/data/long.ini similarity index 100% rename from legacy/efreet/src/bin/data/long.ini rename to legacy/efreet/src/tests/data/long.ini diff --git a/legacy/efreet/src/bin/data/preferences.menu b/legacy/efreet/src/tests/data/preferences.menu similarity index 100% rename from legacy/efreet/src/bin/data/preferences.menu rename to legacy/efreet/src/tests/data/preferences.menu diff --git a/legacy/efreet/src/bin/data/sub/.cvsignore b/legacy/efreet/src/tests/data/sub/.cvsignore similarity index 100% rename from legacy/efreet/src/bin/data/sub/.cvsignore rename to legacy/efreet/src/tests/data/sub/.cvsignore diff --git a/legacy/efreet/src/bin/data/sub/Makefile.am b/legacy/efreet/src/tests/data/sub/Makefile.am similarity index 100% rename from legacy/efreet/src/bin/data/sub/Makefile.am rename to legacy/efreet/src/tests/data/sub/Makefile.am diff --git a/legacy/efreet/src/bin/data/sub/test.desktop b/legacy/efreet/src/tests/data/sub/test.desktop similarity index 100% rename from legacy/efreet/src/bin/data/sub/test.desktop rename to legacy/efreet/src/tests/data/sub/test.desktop diff --git a/legacy/efreet/src/bin/data/test.desktop b/legacy/efreet/src/tests/data/test.desktop similarity index 100% rename from legacy/efreet/src/bin/data/test.desktop rename to legacy/efreet/src/tests/data/test.desktop diff --git a/legacy/efreet/src/bin/data/test.ini b/legacy/efreet/src/tests/data/test.ini similarity index 100% rename from legacy/efreet/src/bin/data/test.ini rename to legacy/efreet/src/tests/data/test.ini diff --git a/legacy/efreet/src/bin/data/test.menu b/legacy/efreet/src/tests/data/test.menu similarity index 100% rename from legacy/efreet/src/bin/data/test.menu rename to legacy/efreet/src/tests/data/test.menu diff --git a/legacy/efreet/src/bin/data/test_garbage b/legacy/efreet/src/tests/data/test_garbage similarity index 100% rename from legacy/efreet/src/bin/data/test_garbage rename to legacy/efreet/src/tests/data/test_garbage diff --git a/legacy/efreet/src/bin/data/test_menu_bad_comment.menu b/legacy/efreet/src/tests/data/test_menu_bad_comment.menu similarity index 100% rename from legacy/efreet/src/bin/data/test_menu_bad_comment.menu rename to legacy/efreet/src/tests/data/test_menu_bad_comment.menu diff --git a/legacy/efreet/src/bin/data/test_menu_slash_bad.menu b/legacy/efreet/src/tests/data/test_menu_slash_bad.menu similarity index 100% rename from legacy/efreet/src/bin/data/test_menu_slash_bad.menu rename to legacy/efreet/src/tests/data/test_menu_slash_bad.menu diff --git a/legacy/efreet/src/bin/data/test_type.desktop b/legacy/efreet/src/tests/data/test_type.desktop similarity index 100% rename from legacy/efreet/src/bin/data/test_type.desktop rename to legacy/efreet/src/tests/data/test_type.desktop diff --git a/legacy/efreet/src/tests/ef_cache.c b/legacy/efreet/src/tests/ef_cache.c new file mode 100644 index 0000000000..39b97fbb76 --- /dev/null +++ b/legacy/efreet/src/tests/ef_cache.c @@ -0,0 +1,143 @@ +/* vim: set sw=4 ts=4 sts=4 et: */ +#include "Efreet.h" +#include +#include +#include "ef_test.h" + +#if 0 +EAPI Efreet_Desktop *efreet_util_desktop_file_id_find(const char *file_id); + +EAPI Eina_List *efreet_util_desktop_generic_name_glob_list(const char *glob); +EAPI Eina_List *efreet_util_desktop_comment_glob_list(const char *glob); +#endif + +static void +check(void) +{ + Eina_List *list; + Efreet_Desktop *desktop; + double start; + const char *id; + + // EAPI char *efreet_util_path_to_file_id(const char *path); + start = ecore_time_get(); + id = efreet_util_path_to_file_id("/usr/share/applications/gnome-panel.desktop"); + if (id) + { + printf("efreet_util_path_to_file_id(/usr/share/applications/gnome-panel.desktop): %s %.3f\n", id, (ecore_time_get() - start)); + } + else + printf("efreet_util_path_to_file_id(/usr/share/applications/gnome-panel.desktop): NULL %.3f\n", (ecore_time_get() - start)); + + //EAPI Efreet_Desktop *efreet_util_desktop_name_find(const char *name); + start = ecore_time_get(); + desktop = efreet_util_desktop_name_find("Evolution"); + if (desktop) + printf("efreet_util_desktop_name_find(Evolution): %s %.3f\n", desktop->orig_path, (ecore_time_get() - start)); + else + printf("efreet_util_desktop_name_find(Evolution): NULL %.3f\n", (ecore_time_get() - start)); + efreet_desktop_free(desktop); + + //EAPI Efreet_Desktop *efreet_util_desktop_generic_name_find(const char *generic_name); + start = ecore_time_get(); + desktop = efreet_util_desktop_generic_name_find("Spreadsheet"); + if (desktop) + printf("efreet_util_desktop_generic_name_find(Spreadsheet): %s %.3f\n", desktop->orig_path, (ecore_time_get() - start)); + else + printf("efreet_util_desktop_generic_name_find(Spreadsheet): NULL %.3f\n", (ecore_time_get() - start)); + efreet_desktop_free(desktop); + + //EAPI Efreet_Desktop *efreet_util_desktop_wm_class_find(const char *wmname, const char *wmclass); + start = ecore_time_get(); + desktop = efreet_util_desktop_wm_class_find("Firefox", NULL); + if (desktop) + printf("efreet_util_desktop_wm_class_find(Firefox): %s %.3f\n", desktop->orig_path, (ecore_time_get() - start)); + else + printf("efreet_util_desktop_wm_class_find(Firefox): NULL %.3f\n", (ecore_time_get() - start)); + efreet_desktop_free(desktop); + + //EAPI Efreet_Desktop *efreet_util_desktop_exec_find(const char *exec); + start = ecore_time_get(); + desktop = efreet_util_desktop_exec_find("/usr/bin/update-manager"); + if (desktop) + printf("efreet_util_desktop_exec_find(update-manager): %s %.3f\n", desktop->orig_path, (ecore_time_get() - start)); + else + printf("efreet_util_desktop_exec_find(update-manager): NULL %.3f\n", (ecore_time_get() - start)); + efreet_desktop_free(desktop); + + //EAPI Eina_List *efreet_util_desktop_name_glob_list(const char *glob); + start = ecore_time_get(); + list = efreet_util_desktop_name_glob_list("Ubuntu*"); + if (list) + { + EINA_LIST_FREE(list, desktop) + { + printf("efreet_util_desktop_name_glob_list(Ubuntu*): %s\n", desktop->name); + efreet_desktop_free(desktop); + } + } + printf("time: %.3f\n", (ecore_time_get() - start)); + + //EAPI Eina_List *efreet_util_desktop_mime_list(const char *mime); + start = ecore_time_get(); + list = efreet_util_desktop_mime_list("application/ogg"); + if (list) + { + EINA_LIST_FREE(list, desktop) + { + printf("efreet_util_desktop_mime_list(application/ogg): %s\n", desktop->name); + efreet_desktop_free(desktop); + } + } + printf("time: %.3f\n", (ecore_time_get() - start)); + + //EAPI Eina_List *efreet_util_desktop_exec_glob_list(const char *glob); + start = ecore_time_get(); + list = efreet_util_desktop_exec_glob_list("*gnome*"); + if (list) + { + EINA_LIST_FREE(list, desktop) + { + printf("efreet_util_desktop_exec_glob_list(*gnome*): %s\n", desktop->exec); + efreet_desktop_free(desktop); + } + } + printf("time: %.3f\n", (ecore_time_get() - start)); + + //EAPI Eina_List *efreet_util_desktop_categories_list(void); + start = ecore_time_get(); + list = efreet_util_desktop_categories_list(); + if (list) + { + EINA_LIST_FREE(list, id) + { + printf("efreet_util_desktop_categories_list(): %s\n", id); + } + } + printf("time: %.3f\n", (ecore_time_get() - start)); + + //EAPI Eina_List *efreet_util_desktop_category_list(const char *category); + start = ecore_time_get(); + list = efreet_util_desktop_category_list("Graphics"); + if (list) + { + EINA_LIST_FREE(list, desktop) + { + printf("efreet_util_desktop_category_list(Graphics): %s\n", desktop->name); + efreet_desktop_free(desktop); + } + } + printf("time: %.3f\n", (ecore_time_get() - start)); + +} + +int +main(int argc __UNUSED__, char **argv __UNUSED__) +{ + if (!efreet_init()) return 1; + if (!efreet_util_init()) return 1; + check(); + efreet_util_shutdown(); + efreet_shutdown(); + return 0; +} diff --git a/legacy/efreet/src/bin/ef_data_dirs.c b/legacy/efreet/src/tests/ef_data_dirs.c similarity index 97% rename from legacy/efreet/src/bin/ef_data_dirs.c rename to legacy/efreet/src/tests/ef_data_dirs.c index 8270531846..f5705fd659 100644 --- a/legacy/efreet/src/bin/ef_data_dirs.c +++ b/legacy/efreet/src/tests/ef_data_dirs.c @@ -166,7 +166,7 @@ ef_cb_efreet_data_dirs(void) int ret = 1, i; char dirs[128], *val; char *vals[] = {"/var/tmp/a", "/tmp/b", "/usr/local/share", "/etc", NULL}; - char *def_vals[] = {"/usr/local/share", "/usr/share", NULL}; + char *def_vals[] = {PACKAGE_DATA_DIR, "/usr/share", "/usr/local/share", NULL}; dirs[0] = '\0'; for (i = 0; vals[i] != NULL; i++) @@ -207,7 +207,7 @@ ef_cb_efreet_data_dirs(void) i = 0; tmp = efreet_data_dirs_get(); - if (eina_list_count(tmp) != 2) + if (eina_list_count(tmp) != 3) { printf("efreet_data_dirs_get() nodes is differnet from expected default\n"); ret = 0; @@ -226,7 +226,7 @@ ef_cb_efreet_data_dirs(void) if (strcmp(val, def_vals[i])) { printf("efreet_data_dirs_get() returned incorrect value (%s) when " - "XDG_DATA_DIRS= is set\n", val); + "XDG_DATA_DIRS= is set %s\n", val, def_vals[i]); ret = 0; } diff --git a/legacy/efreet/src/bin/ef_desktop.c b/legacy/efreet/src/tests/ef_desktop.c similarity index 99% rename from legacy/efreet/src/bin/ef_desktop.c rename to legacy/efreet/src/tests/ef_desktop.c index 4e0682301c..f4b1005798 100644 --- a/legacy/efreet/src/bin/ef_desktop.c +++ b/legacy/efreet/src/tests/ef_desktop.c @@ -213,6 +213,7 @@ ef_cb_desktop_command_get(void) expected = eina_list_free(expected); /* test single dir */ +#if 0 info->type = 'd'; IF_FREE(desktop->exec); desktop->exec = strdup("app %d"); @@ -224,9 +225,11 @@ ef_cb_desktop_command_get(void) info->expected = expected; efreet_desktop_command_get(desktop, files, _cb_command, info); expected = eina_list_free(expected); +#endif /* test single names */ +#if 0 info->type = 'n'; IF_FREE(desktop->exec); desktop->exec = strdup("app %n"); @@ -238,6 +241,7 @@ ef_cb_desktop_command_get(void) info->expected = expected; efreet_desktop_command_get(desktop, files, _cb_command, info); expected = eina_list_free(expected); +#endif /* test multiple fullpaths */ info->type = 'F'; @@ -260,6 +264,7 @@ ef_cb_desktop_command_get(void) expected = eina_list_free(expected); /* test multiple dirs */ +#if 0 info->type = 'D'; IF_FREE(desktop->exec); desktop->exec = strdup("app %D"); @@ -268,8 +273,10 @@ ef_cb_desktop_command_get(void) info->expected = expected; efreet_desktop_command_get(desktop, files, _cb_command, info); expected = eina_list_free(expected); +#endif /* test multiple names */ +#if 0 info->type = 'N'; IF_FREE(desktop->exec); desktop->exec = strdup("app %N"); @@ -278,6 +285,7 @@ ef_cb_desktop_command_get(void) info->expected = expected; efreet_desktop_command_get(desktop, files, _cb_command, info); expected = eina_list_free(expected); +#endif /* test icon appending */ info->type = 'i'; diff --git a/legacy/efreet/src/bin/ef_icon_theme.c b/legacy/efreet/src/tests/ef_icon_theme.c similarity index 100% rename from legacy/efreet/src/bin/ef_icon_theme.c rename to legacy/efreet/src/tests/ef_icon_theme.c diff --git a/legacy/efreet/src/bin/ef_ini.c b/legacy/efreet/src/tests/ef_ini.c similarity index 100% rename from legacy/efreet/src/bin/ef_ini.c rename to legacy/efreet/src/tests/ef_ini.c diff --git a/legacy/efreet/src/bin/ef_locale.c b/legacy/efreet/src/tests/ef_locale.c similarity index 100% rename from legacy/efreet/src/bin/ef_locale.c rename to legacy/efreet/src/tests/ef_locale.c diff --git a/legacy/efreet/src/bin/ef_menu.c b/legacy/efreet/src/tests/ef_menu.c similarity index 100% rename from legacy/efreet/src/bin/ef_menu.c rename to legacy/efreet/src/tests/ef_menu.c diff --git a/legacy/efreet/src/bin/ef_mime.c b/legacy/efreet/src/tests/ef_mime.c similarity index 100% rename from legacy/efreet/src/bin/ef_mime.c rename to legacy/efreet/src/tests/ef_mime.c diff --git a/legacy/efreet/src/bin/ef_test.h b/legacy/efreet/src/tests/ef_test.h similarity index 100% rename from legacy/efreet/src/bin/ef_test.h rename to legacy/efreet/src/tests/ef_test.h diff --git a/legacy/efreet/src/bin/ef_utils.c b/legacy/efreet/src/tests/ef_utils.c similarity index 88% rename from legacy/efreet/src/bin/ef_utils.c rename to legacy/efreet/src/tests/ef_utils.c index 837783706a..ad973f3633 100644 --- a/legacy/efreet/src/bin/ef_utils.c +++ b/legacy/efreet/src/tests/ef_utils.c @@ -17,10 +17,16 @@ ef_cb_utils(void) desktop = efreet_util_desktop_file_id_find("kde-kresources.desktop"); printf("kde-kresources.desktop: %p\n", desktop); + efreet_desktop_free(desktop); + desktop = efreet_util_desktop_file_id_find("mplayer.desktop"); printf("mplayer.desktop: %p\n", desktop); + efreet_desktop_free(desktop); + desktop = efreet_util_desktop_file_id_find("nautilus-computer.desktop"); printf("nautilus-computer.desktop: %p\n", desktop); + efreet_desktop_free(desktop); + efreet_util_shutdown(); return 1; } diff --git a/legacy/efreet/src/bin/efreet_spec_test.c b/legacy/efreet/src/tests/efreet_spec_test.c similarity index 100% rename from legacy/efreet/src/bin/efreet_spec_test.c rename to legacy/efreet/src/tests/efreet_spec_test.c diff --git a/legacy/efreet/src/bin/main.c b/legacy/efreet/src/tests/main.c similarity index 100% rename from legacy/efreet/src/bin/main.c rename to legacy/efreet/src/tests/main.c