Eet cache for efreet desktop

SVN revision: 46726
This commit is contained in:
Sebastian Dransfeld 2010-03-01 18:16:32 +00:00
parent cf5a3517b9
commit f72d4f9342
51 changed files with 965 additions and 1134 deletions

View File

@ -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
], []
)

View File

@ -1,4 +1,4 @@
SUBDIRS = lib bin
SUBDIRS = lib bin tests
MAINTAINERCLEANFILES = Makefile.in

View File

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

View File

@ -1,48 +0,0 @@
#include "Efreet.h"
#include <stdio.h>
#include <Ecore.h>
#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;
}

View File

@ -0,0 +1,254 @@
/* vim: set sw=4 ts=4 sts=4 et: */
#include <limits.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>
#include <unistd.h>
#include <Eina.h>
#include <Ecore_File.h>
#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;
}

View File

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

View File

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

View File

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

View File

@ -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,6 +606,18 @@ efreet_desktop_free(Efreet_Desktop *desktop)
if (desktop->cached && efreet_desktop_cache)
eina_hash_del(efreet_desktop_cache, desktop->orig_path, NULL);
if (desktop->eet)
{
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);
@ -561,6 +649,7 @@ efreet_desktop_free(Efreet_Desktop *desktop)
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);
}

View File

@ -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 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);
/**
* @}
*/

View File

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

View File

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

View File

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

View File

@ -2,6 +2,8 @@
#ifndef EFREET_PRIVATE_H
#define EFREET_PRIVATE_H
#include <Eet.h>
/**
* @file efreet_private.h
* @brief Contains methods and defines that are private to the Efreet
@ -177,7 +179,7 @@ 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,
EAPI Eina_List *efreet_default_dirs_get(const char *user_dir,
Eina_List *system_dirs,
const char *suffix);
@ -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
/**

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

Before

Width:  |  Height:  |  Size: 648 B

After

Width:  |  Height:  |  Size: 648 B

View File

@ -0,0 +1,143 @@
/* vim: set sw=4 ts=4 sts=4 et: */
#include "Efreet.h"
#include <stdio.h>
#include <Ecore.h>
#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;
}

View File

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

View File

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

View File

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