2010-11-15 13:07:22 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2011-02-01 13:03:40 -08:00
|
|
|
/* TODO: Consider flushing local icons cache after idling.
|
|
|
|
* Icon requests will probably come in batches, f.ex. during menu
|
|
|
|
* browsing.
|
|
|
|
*/
|
2011-01-31 03:44:56 -08:00
|
|
|
|
2011-02-10 06:25:23 -08:00
|
|
|
#include <libgen.h>
|
2010-11-22 06:16:09 -08:00
|
|
|
#include <unistd.h>
|
2010-11-23 18:40:54 -08:00
|
|
|
#include <sys/stat.h>
|
2011-08-18 00:35:48 -07:00
|
|
|
#include <fcntl.h>
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2010-11-26 09:05:16 -08:00
|
|
|
#include <Eet.h>
|
|
|
|
#include <Ecore.h>
|
2010-11-25 15:52:57 -08:00
|
|
|
#include <Ecore_File.h>
|
2012-11-01 18:46:44 -07:00
|
|
|
#include <EDBus.h>
|
2010-11-25 15:52:57 -08:00
|
|
|
|
2011-02-05 11:05:55 -08:00
|
|
|
/* define macros and variable for using the eina logging system */
|
|
|
|
#define EFREET_MODULE_LOG_DOM _efreet_cache_log_dom
|
|
|
|
static int _efreet_cache_log_dom = -1;
|
|
|
|
|
2010-11-15 13:07:22 -08:00
|
|
|
#include "Efreet.h"
|
|
|
|
#include "efreet_private.h"
|
2010-11-27 12:15:00 -08:00
|
|
|
#include "efreet_cache_private.h"
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2011-02-10 06:34:03 -08:00
|
|
|
#define NON_EXISTING (void *)-1
|
|
|
|
|
2010-11-23 12:14:13 -08:00
|
|
|
typedef struct _Efreet_Old_Cache Efreet_Old_Cache;
|
|
|
|
|
|
|
|
struct _Efreet_Old_Cache
|
|
|
|
{
|
|
|
|
Eina_Hash *hash;
|
|
|
|
Eet_File *ef;
|
|
|
|
};
|
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
/* TODO: Common define location with daemon */
|
|
|
|
#define BUS "org.enlightenment.Efreet"
|
|
|
|
#define PATH "/org/enlightenment/Efreet"
|
|
|
|
#define INTERFACE "org.enlightenment.Efreet"
|
|
|
|
|
|
|
|
static EDBus_Connection *conn = NULL;
|
|
|
|
static EDBus_Proxy *proxy = NULL;
|
2010-11-15 13:07:22 -08:00
|
|
|
/**
|
|
|
|
* Data for cache files
|
|
|
|
*/
|
2010-11-29 05:17:33 -08:00
|
|
|
static Eet_Data_Descriptor *directory_edd = NULL;
|
2010-12-08 13:39:43 -08:00
|
|
|
static Eet_Data_Descriptor *icon_theme_edd = NULL;
|
|
|
|
static Eet_Data_Descriptor *icon_theme_directory_edd = NULL;
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
static Eet_Data_Descriptor *icon_fallback_edd = NULL;
|
|
|
|
static Eet_Data_Descriptor *icon_element_pointer_edd = NULL;
|
|
|
|
static Eet_Data_Descriptor *icon_element_edd = NULL;
|
|
|
|
static Eet_Data_Descriptor *icon_edd = NULL;
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2010-12-03 01:55:36 -08:00
|
|
|
static Eet_File *icon_cache = NULL;
|
2011-01-31 03:44:56 -08:00
|
|
|
static Eet_File *fallback_cache = NULL;
|
2010-12-09 00:56:56 -08:00
|
|
|
static Eet_File *icon_theme_cache = NULL;
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2011-02-09 09:09:16 -08:00
|
|
|
static Eina_Hash *themes = NULL;
|
2011-02-01 13:03:40 -08:00
|
|
|
static Eina_Hash *icons = NULL;
|
|
|
|
static Eina_Hash *fallbacks = NULL;
|
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
static const char *icon_theme_cache_file = NULL;
|
|
|
|
|
2010-11-26 06:56:23 -08:00
|
|
|
static const char *theme_name = NULL;
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2010-12-03 01:55:36 -08:00
|
|
|
static Eet_Data_Descriptor *version_edd = NULL;
|
2010-11-23 12:14:13 -08:00
|
|
|
static Eet_Data_Descriptor *desktop_edd = NULL;
|
2011-01-31 03:32:34 -08:00
|
|
|
static Eet_Data_Descriptor *hash_array_string_edd = NULL;
|
|
|
|
static Eet_Data_Descriptor *array_string_edd = NULL;
|
|
|
|
static Eet_Data_Descriptor *hash_string_edd = NULL;
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2011-02-10 06:25:44 -08:00
|
|
|
static Eina_Hash *desktops = NULL;
|
2010-11-23 12:14:13 -08:00
|
|
|
static Eet_File *desktop_cache = NULL;
|
|
|
|
static const char *desktop_cache_file = NULL;
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2010-11-23 12:14:13 -08:00
|
|
|
static Eina_List *old_desktop_caches = NULL;
|
2010-11-16 13:50:53 -08:00
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
static const char *util_cache_file = NULL;
|
|
|
|
static Eet_File *util_cache = NULL;
|
|
|
|
static Efreet_Cache_Hash *util_cache_hash = NULL;
|
|
|
|
static const char *util_cache_hash_key = NULL;
|
|
|
|
static Efreet_Cache_Array_String *util_cache_names = NULL;
|
|
|
|
static const char *util_cache_names_key = NULL;
|
|
|
|
|
2010-12-02 00:32:59 -08:00
|
|
|
static void efreet_cache_edd_shutdown(void);
|
2011-02-01 13:03:40 -08:00
|
|
|
static void efreet_cache_icon_free(Efreet_Cache_Icon *icon);
|
|
|
|
static void efreet_cache_icon_fallback_free(Efreet_Cache_Fallback_Icon *icon);
|
2011-02-10 06:24:09 -08:00
|
|
|
static void efreet_cache_icon_theme_free(Efreet_Icon_Theme *theme);
|
2010-11-22 06:16:48 -08:00
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
static Eina_Bool efreet_cache_check(Eet_File **ef, const char *path, int major);
|
|
|
|
static void *efreet_cache_close(Eet_File *ef);
|
|
|
|
|
2012-11-02 13:12:41 -07:00
|
|
|
static void on_send_register(void *data, const EDBus_Message *msg, EDBus_Pending *pending);
|
2012-11-01 18:46:44 -07:00
|
|
|
static void desktop_cache_update(void *context, const EDBus_Message *msg);
|
|
|
|
static void icon_cache_update(void *context, const EDBus_Message *msg);
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2010-12-11 12:37:17 -08:00
|
|
|
static void icon_cache_update_free(void *data, void *ev);
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2011-02-09 09:09:38 -08:00
|
|
|
static void *hash_array_string_add(void *hash, const char *key, void *data);
|
|
|
|
|
2010-11-22 06:16:09 -08:00
|
|
|
EAPI int EFREET_EVENT_ICON_CACHE_UPDATE = 0;
|
2010-11-23 12:14:13 -08:00
|
|
|
EAPI int EFREET_EVENT_DESKTOP_CACHE_UPDATE = 0;
|
2011-08-18 00:34:19 -07:00
|
|
|
EAPI int EFREET_EVENT_DESKTOP_CACHE_BUILD = 0;
|
2010-11-15 13:07:22 -08:00
|
|
|
|
|
|
|
int
|
|
|
|
efreet_cache_init(void)
|
|
|
|
{
|
2010-11-26 06:56:23 -08:00
|
|
|
_efreet_cache_log_dom = eina_log_domain_register("efreet_cache", EFREET_DEFAULT_LOG_COLOR);
|
|
|
|
if (_efreet_cache_log_dom < 0)
|
|
|
|
return 0;
|
2010-11-22 06:16:09 -08:00
|
|
|
|
|
|
|
EFREET_EVENT_ICON_CACHE_UPDATE = ecore_event_type_new();
|
2010-11-23 12:14:13 -08:00
|
|
|
EFREET_EVENT_DESKTOP_CACHE_UPDATE = ecore_event_type_new();
|
2011-08-18 00:34:19 -07:00
|
|
|
EFREET_EVENT_DESKTOP_CACHE_BUILD = ecore_event_type_new();
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2011-02-09 09:09:16 -08:00
|
|
|
themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free));
|
2011-02-01 13:03:40 -08:00
|
|
|
icons = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_free));
|
|
|
|
fallbacks = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_fallback_free));
|
2011-02-10 06:25:44 -08:00
|
|
|
desktops = eina_hash_string_superfast_new(NULL);
|
2011-02-01 13:03:40 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
edbus_init();
|
2010-11-22 06:16:09 -08:00
|
|
|
if (efreet_cache_update)
|
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
EDBus_Object *obj;
|
2012-10-18 02:39:44 -07:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SESSION);
|
|
|
|
if (!conn) goto error;
|
2011-04-12 15:40:35 -07:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
obj = edbus_object_get(conn, BUS, PATH);
|
|
|
|
proxy = edbus_proxy_get(obj, INTERFACE);
|
|
|
|
edbus_proxy_signal_handler_add(proxy, "IconCacheUpdate", icon_cache_update, NULL);
|
|
|
|
edbus_proxy_signal_handler_add(proxy, "DesktopCacheUpdate", desktop_cache_update, NULL);
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2012-11-26 08:07:55 -08:00
|
|
|
edbus_proxy_call(proxy, "Register", on_send_register, NULL, -1, "s", efreet_language_get());
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
/*
|
|
|
|
* TODO: Needed?
|
|
|
|
edbus_name_owner_changed_callback_add(conn, BUS, on_name_owner_changed,
|
|
|
|
conn, EINA_TRUE);
|
|
|
|
*/
|
2010-11-22 06:16:09 -08:00
|
|
|
}
|
|
|
|
|
2010-11-15 13:07:22 -08:00
|
|
|
return 1;
|
2010-11-23 12:14:13 -08:00
|
|
|
error:
|
2011-02-10 06:24:50 -08:00
|
|
|
if (themes) eina_hash_free(themes);
|
|
|
|
themes = NULL;
|
|
|
|
if (icons) eina_hash_free(icons);
|
|
|
|
icons = NULL;
|
|
|
|
if (fallbacks) eina_hash_free(fallbacks);
|
|
|
|
fallbacks = NULL;
|
2011-02-10 06:25:44 -08:00
|
|
|
if (desktops) eina_hash_free(desktops);
|
|
|
|
desktops = NULL;
|
2011-02-10 06:24:50 -08:00
|
|
|
|
2010-12-02 00:32:59 -08:00
|
|
|
efreet_cache_edd_shutdown();
|
2010-11-22 06:16:09 -08:00
|
|
|
return 0;
|
2010-11-15 13:07:22 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
efreet_cache_shutdown(void)
|
|
|
|
{
|
2010-11-23 12:14:13 -08:00
|
|
|
Efreet_Old_Cache *d;
|
|
|
|
|
2010-12-12 14:17:05 -08:00
|
|
|
IF_RELEASE(theme_name);
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2010-12-03 01:55:36 -08:00
|
|
|
icon_cache = efreet_cache_close(icon_cache);
|
2010-12-09 00:56:56 -08:00
|
|
|
icon_theme_cache = efreet_cache_close(icon_theme_cache);
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2011-02-09 09:09:16 -08:00
|
|
|
IF_FREE_HASH(themes);
|
2011-02-01 13:03:40 -08:00
|
|
|
IF_FREE_HASH(icons);
|
|
|
|
IF_FREE_HASH(fallbacks);
|
|
|
|
|
2011-02-10 06:25:44 -08:00
|
|
|
IF_FREE_HASH_CB(desktops, EINA_FREE_CB(efreet_cache_desktop_free));
|
2010-12-02 00:34:07 -08:00
|
|
|
desktop_cache = efreet_cache_close(desktop_cache);
|
2010-11-23 12:14:13 -08:00
|
|
|
IF_RELEASE(desktop_cache_file);
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2010-12-02 00:32:59 -08:00
|
|
|
efreet_cache_edd_shutdown();
|
2010-12-08 13:39:43 -08:00
|
|
|
IF_RELEASE(icon_theme_cache_file);
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2011-08-18 00:34:40 -07:00
|
|
|
if (old_desktop_caches)
|
2011-08-19 21:22:24 -07:00
|
|
|
ERR("This application has not properly closed all its desktop references!");
|
2010-11-23 12:14:13 -08:00
|
|
|
EINA_LIST_FREE(old_desktop_caches, d)
|
|
|
|
{
|
|
|
|
eina_hash_free(d->hash);
|
2011-08-18 00:34:40 -07:00
|
|
|
eet_close(d->ef);
|
2010-11-23 12:14:13 -08:00
|
|
|
free(d);
|
|
|
|
}
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
IF_RELEASE(util_cache_names_key);
|
|
|
|
efreet_cache_array_string_free(util_cache_names);
|
|
|
|
util_cache_names = NULL;
|
|
|
|
|
|
|
|
IF_RELEASE(util_cache_hash_key);
|
|
|
|
if (util_cache_hash)
|
|
|
|
{
|
|
|
|
eina_hash_free(util_cache_hash->hash);
|
|
|
|
free(util_cache_hash);
|
|
|
|
util_cache_hash = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
util_cache = efreet_cache_close(util_cache);
|
|
|
|
IF_RELEASE(util_cache_file);
|
|
|
|
|
2010-11-26 06:56:23 -08:00
|
|
|
eina_log_domain_unregister(_efreet_cache_log_dom);
|
2011-02-05 11:06:55 -08:00
|
|
|
_efreet_cache_log_dom = -1;
|
2012-11-01 18:46:44 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* TODO: Needed??
|
|
|
|
edbus_name_owner_changed_callback_del(conn, BUS, on_name_owner_changed, conn);
|
|
|
|
*/
|
2012-11-02 13:12:41 -07:00
|
|
|
if (conn)
|
2012-12-14 06:27:14 -08:00
|
|
|
{
|
|
|
|
EDBus_Object *obj = edbus_proxy_object_get(proxy);
|
|
|
|
edbus_proxy_unref(proxy);
|
|
|
|
edbus_object_unref(obj);
|
|
|
|
edbus_connection_unref(conn);
|
|
|
|
}
|
2012-11-01 18:46:44 -07:00
|
|
|
|
|
|
|
edbus_shutdown();
|
2010-11-15 13:07:22 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI const char *
|
2011-01-31 03:44:56 -08:00
|
|
|
efreet_icon_cache_file(const char *theme)
|
2010-11-15 13:07:22 -08:00
|
|
|
{
|
|
|
|
static char cache_file[PATH_MAX] = { '\0' };
|
2010-12-04 08:02:20 -08:00
|
|
|
const char *cache;
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2012-05-23 13:10:27 -07:00
|
|
|
EINA_SAFETY_ON_NULL_RETURN_VAL(theme, NULL);
|
|
|
|
|
2010-12-04 08:02:20 -08:00
|
|
|
cache = efreet_cache_home_get();
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
snprintf(cache_file, sizeof(cache_file), "%s/efreet/icons_%s_%s.eet", cache, theme, efreet_hostname_get());
|
2010-11-15 13:07:22 -08:00
|
|
|
|
|
|
|
return cache_file;
|
|
|
|
}
|
2010-12-08 13:39:43 -08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI const char *
|
|
|
|
efreet_icon_theme_cache_file(void)
|
|
|
|
{
|
2010-12-09 05:41:22 -08:00
|
|
|
char tmp[PATH_MAX] = { '\0' };
|
2010-12-08 13:39:43 -08:00
|
|
|
|
|
|
|
if (icon_theme_cache_file) return icon_theme_cache_file;
|
|
|
|
|
2010-12-09 05:41:22 -08:00
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/icon_themes_%s.eet",
|
2010-12-08 13:39:43 -08:00
|
|
|
efreet_cache_home_get(), efreet_hostname_get());
|
|
|
|
icon_theme_cache_file = eina_stringshare_add(tmp);
|
|
|
|
|
|
|
|
return icon_theme_cache_file;
|
|
|
|
}
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI const char *
|
|
|
|
efreet_desktop_util_cache_file(void)
|
|
|
|
{
|
|
|
|
char tmp[PATH_MAX] = { '\0' };
|
|
|
|
const char *cache_dir, *lang, *country, *modifier;
|
|
|
|
|
|
|
|
if (util_cache_file) return util_cache_file;
|
|
|
|
|
|
|
|
cache_dir = efreet_cache_home_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@%s.eet", cache_dir, efreet_hostname_get(), lang, country, modifier);
|
|
|
|
else if (lang && country)
|
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_util_%s_%s_%s.eet", cache_dir, efreet_hostname_get(), lang, country);
|
|
|
|
else if (lang)
|
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_util_%s_%s.eet", cache_dir, efreet_hostname_get(), lang);
|
|
|
|
else
|
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_util_%s.eet", cache_dir, efreet_hostname_get());
|
|
|
|
|
|
|
|
util_cache_file = eina_stringshare_add(tmp);
|
|
|
|
return util_cache_file;
|
|
|
|
}
|
|
|
|
|
2010-12-02 02:47:34 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
|
|
|
efreet_version_edd(void)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
2010-12-03 01:55:36 -08:00
|
|
|
if (version_edd) return version_edd;
|
2010-12-02 02:47:34 -08:00
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Version);
|
2010-12-03 01:55:36 -08:00
|
|
|
version_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!version_edd) return NULL;
|
2010-12-02 02:47:34 -08:00
|
|
|
|
2010-12-03 01:55:36 -08:00
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(version_edd, Efreet_Cache_Version,
|
2010-12-02 02:47:34 -08:00
|
|
|
"minor", minor, EET_T_UCHAR);
|
2010-12-03 01:55:36 -08:00
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(version_edd, Efreet_Cache_Version,
|
2010-12-02 02:47:34 -08:00
|
|
|
"major", major, EET_T_UCHAR);
|
|
|
|
|
2010-12-03 01:55:36 -08:00
|
|
|
return version_edd;
|
2010-12-02 02:47:34 -08:00
|
|
|
}
|
|
|
|
|
2011-01-31 03:32:34 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
|
|
|
efreet_hash_array_string_edd(void)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
|
|
|
if (hash_array_string_edd) return hash_array_string_edd;
|
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Hash);
|
2011-02-09 09:09:38 -08:00
|
|
|
eddc.func.hash_add = hash_array_string_add;
|
2011-01-31 03:32:34 -08:00
|
|
|
hash_array_string_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!hash_array_string_edd) return NULL;
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_HASH(hash_array_string_edd, Efreet_Cache_Hash,
|
|
|
|
"hash", hash, efreet_array_string_edd());
|
|
|
|
|
|
|
|
return hash_array_string_edd;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
|
|
|
efreet_hash_string_edd(void)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
|
|
|
if (hash_string_edd) return hash_string_edd;
|
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Hash);
|
|
|
|
hash_string_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!hash_string_edd) return NULL;
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_HASH_STRING(hash_string_edd, Efreet_Cache_Hash,
|
|
|
|
"hash", hash);
|
|
|
|
|
|
|
|
return hash_string_edd;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
|
|
|
efreet_array_string_edd(void)
|
|
|
|
{
|
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
|
|
|
if (array_string_edd) return array_string_edd;
|
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Array_String);
|
|
|
|
array_string_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!array_string_edd) return NULL;
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY_STRING(array_string_edd, Efreet_Cache_Array_String,
|
|
|
|
"array", array);
|
|
|
|
|
|
|
|
return array_string_edd;
|
|
|
|
}
|
|
|
|
|
2010-11-23 12:14:13 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI const char *
|
|
|
|
efreet_desktop_cache_file(void)
|
|
|
|
{
|
2010-12-09 05:41:22 -08:00
|
|
|
char tmp[PATH_MAX] = { '\0' };
|
2010-12-04 08:02:20 -08:00
|
|
|
const char *cache, *lang, *country, *modifier;
|
2010-11-23 12:14:13 -08:00
|
|
|
|
|
|
|
if (desktop_cache_file) return desktop_cache_file;
|
|
|
|
|
2010-12-04 08:02:20 -08:00
|
|
|
cache = efreet_cache_home_get();
|
2010-11-23 12:14:13 -08:00
|
|
|
lang = efreet_lang_get();
|
|
|
|
country = efreet_lang_country_get();
|
|
|
|
modifier = efreet_lang_modifier_get();
|
|
|
|
|
|
|
|
if (lang && country && modifier)
|
2010-12-09 05:41:22 -08:00
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_%s_%s_%s@%s.eet", cache, efreet_hostname_get(), lang, country, modifier);
|
2010-11-23 12:14:13 -08:00
|
|
|
else if (lang && country)
|
2010-12-09 05:41:22 -08:00
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_%s_%s_%s.eet", cache, efreet_hostname_get(), lang, country);
|
2010-11-23 12:14:13 -08:00
|
|
|
else if (lang)
|
2010-12-09 05:41:22 -08:00
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_%s_%s.eet", cache, efreet_hostname_get(), lang);
|
2010-11-23 12:14:13 -08:00
|
|
|
else
|
2010-12-09 05:41:22 -08:00
|
|
|
snprintf(tmp, sizeof(tmp), "%s/efreet/desktop_%s.eet", cache, efreet_hostname_get());
|
2010-11-23 12:14:13 -08:00
|
|
|
|
|
|
|
desktop_cache_file = eina_stringshare_add(tmp);
|
|
|
|
return desktop_cache_file;
|
|
|
|
}
|
|
|
|
|
2010-12-02 00:32:59 -08:00
|
|
|
#define EDD_SHUTDOWN(Edd) \
|
|
|
|
if (Edd) eet_data_descriptor_free(Edd); \
|
|
|
|
Edd = NULL;
|
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_cache_edd_shutdown(void)
|
|
|
|
{
|
2010-12-03 01:55:36 -08:00
|
|
|
EDD_SHUTDOWN(version_edd);
|
2010-12-02 00:32:59 -08:00
|
|
|
EDD_SHUTDOWN(desktop_edd);
|
2011-01-31 03:32:34 -08:00
|
|
|
EDD_SHUTDOWN(hash_array_string_edd);
|
|
|
|
EDD_SHUTDOWN(array_string_edd);
|
|
|
|
EDD_SHUTDOWN(hash_string_edd);
|
2010-12-08 13:39:43 -08:00
|
|
|
EDD_SHUTDOWN(icon_theme_edd);
|
|
|
|
EDD_SHUTDOWN(icon_theme_directory_edd);
|
2010-12-02 00:32:59 -08:00
|
|
|
EDD_SHUTDOWN(directory_edd);
|
2010-12-08 13:39:43 -08:00
|
|
|
EDD_SHUTDOWN(icon_fallback_edd);
|
2010-12-02 00:32:59 -08:00
|
|
|
EDD_SHUTDOWN(icon_element_pointer_edd);
|
|
|
|
EDD_SHUTDOWN(icon_element_edd);
|
|
|
|
EDD_SHUTDOWN(icon_edd);
|
|
|
|
}
|
|
|
|
|
2010-11-26 06:56:23 -08:00
|
|
|
#define EFREET_POINTER_TYPE(Edd_Dest, Edd_Source, Type) \
|
2010-11-27 12:36:39 -08:00
|
|
|
{ \
|
|
|
|
typedef struct _Efreet_##Type##_Pointer Efreet_##Type##_Pointer; \
|
|
|
|
struct _Efreet_##Type##_Pointer \
|
|
|
|
{ \
|
2010-11-26 06:56:23 -08:00
|
|
|
Efreet_##Type *pointer; \
|
2010-11-27 12:36:39 -08:00
|
|
|
}; \
|
|
|
|
\
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_##Type##_Pointer); \
|
|
|
|
Edd_Dest = eet_data_descriptor_file_new(&eddc); \
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_SUB(Edd_Dest, Efreet_##Type##_Pointer, \
|
|
|
|
"pointer", pointer, Edd_Source); \
|
|
|
|
}
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2010-11-29 05:17:33 -08:00
|
|
|
static Eet_Data_Descriptor *
|
|
|
|
efreet_icon_directory_edd(void)
|
|
|
|
{
|
2010-12-08 13:39:43 -08:00
|
|
|
Eet_Data_Descriptor_Class eddc;
|
2010-11-29 05:17:33 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
if (directory_edd) return directory_edd;
|
2010-11-29 05:17:33 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Directory);
|
|
|
|
directory_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!directory_edd) return NULL;
|
2010-11-29 05:17:33 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
|
|
|
|
"modified_time", modified_time, EET_T_LONG_LONG);
|
2010-11-29 05:17:33 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
return directory_edd;
|
2010-11-29 05:17:33 -08:00
|
|
|
}
|
|
|
|
|
2010-11-15 13:07:22 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
2011-01-31 03:44:56 -08:00
|
|
|
efreet_icon_edd(void)
|
2010-11-15 13:07:22 -08:00
|
|
|
{
|
2010-11-27 12:36:39 -08:00
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
if (icon_edd) return icon_edd;
|
2010-11-27 12:36:39 -08:00
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Icon_Element);
|
|
|
|
icon_element_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!icon_element_edd) return NULL;
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_element_edd, Efreet_Cache_Icon_Element,
|
|
|
|
"type", type, EET_T_USHORT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_element_edd, Efreet_Cache_Icon_Element,
|
|
|
|
"normal", normal, EET_T_USHORT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_element_edd, Efreet_Cache_Icon_Element,
|
|
|
|
"normal", normal, EET_T_USHORT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_element_edd, Efreet_Cache_Icon_Element,
|
|
|
|
"min", min, EET_T_USHORT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_element_edd, Efreet_Cache_Icon_Element,
|
|
|
|
"max", max, EET_T_USHORT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY_STRING(icon_element_edd, Efreet_Cache_Icon_Element,
|
|
|
|
"paths", paths);
|
|
|
|
|
|
|
|
EFREET_POINTER_TYPE(icon_element_pointer_edd, icon_element_edd, Cache_Icon_Element);
|
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Icon);
|
|
|
|
icon_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!icon_edd) return NULL;
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_edd, Efreet_Cache_Icon,
|
|
|
|
"theme", theme, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(icon_edd, Efreet_Cache_Icon,
|
|
|
|
"icons", icons, icon_element_pointer_edd);
|
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
return icon_edd;
|
2010-11-26 06:56:23 -08:00
|
|
|
}
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
2011-01-31 03:44:24 -08:00
|
|
|
efreet_icon_theme_edd(Eina_Bool cache)
|
2010-11-26 06:56:23 -08:00
|
|
|
{
|
2010-12-08 13:39:43 -08:00
|
|
|
Eet_Data_Descriptor_Class eddc;
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2010-12-08 13:39:43 -08:00
|
|
|
if (icon_theme_edd) return icon_theme_edd;
|
|
|
|
|
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Icon_Theme_Directory);
|
|
|
|
icon_theme_directory_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!icon_theme_directory_edd) return NULL;
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"name", name, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"context", context, EET_T_UCHAR);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"type", type, EET_T_UCHAR);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"size.normal", size.normal, EET_T_UINT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"size.min", size.min, EET_T_UINT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"size.max", size.max, EET_T_UINT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
|
|
|
|
"size.threshold", size.threshold, EET_T_UINT);
|
|
|
|
|
2011-01-31 03:44:24 -08:00
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Icon_Theme);
|
2010-12-08 13:39:43 -08:00
|
|
|
icon_theme_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!icon_theme_edd) return NULL;
|
|
|
|
|
2011-01-31 03:44:24 -08:00
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"name.internal", theme.name.internal, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"name.name", theme.name.name, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"comment", theme.comment, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"example_icon", theme.example_icon, EET_T_STRING);
|
2010-12-08 13:39:43 -08:00
|
|
|
|
|
|
|
eet_data_descriptor_element_add(icon_theme_edd, "paths", EET_T_STRING, EET_G_LIST,
|
2011-01-31 03:44:24 -08:00
|
|
|
offsetof(Efreet_Cache_Icon_Theme, theme.paths), 0, NULL, NULL);
|
2010-12-08 13:39:43 -08:00
|
|
|
eet_data_descriptor_element_add(icon_theme_edd, "inherits", EET_T_STRING, EET_G_LIST,
|
2011-01-31 03:44:24 -08:00
|
|
|
offsetof(Efreet_Cache_Icon_Theme, theme.inherits), 0, NULL, NULL);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_LIST(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"directories", theme.directories, icon_theme_directory_edd);
|
2010-12-08 13:39:43 -08:00
|
|
|
|
2011-01-31 03:44:24 -08:00
|
|
|
if (cache)
|
|
|
|
{
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"last_cache_check", last_cache_check, EET_T_LONG_LONG);
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"path", path, EET_T_STRING);
|
|
|
|
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_HASH(icon_theme_edd, Efreet_Cache_Icon_Theme,
|
|
|
|
"dirs", dirs, efreet_icon_directory_edd());
|
|
|
|
}
|
2010-12-08 13:39:43 -08:00
|
|
|
|
|
|
|
return icon_theme_edd;
|
2010-11-15 13:07:22 -08:00
|
|
|
}
|
|
|
|
|
2010-11-16 02:32:21 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
2011-01-31 03:44:56 -08:00
|
|
|
efreet_icon_fallback_edd(void)
|
2010-11-16 02:32:21 -08:00
|
|
|
{
|
2010-11-27 12:36:39 -08:00
|
|
|
Eet_Data_Descriptor_Class eddc;
|
2010-11-16 02:32:21 -08:00
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
if (icon_fallback_edd) return icon_fallback_edd;
|
2010-11-16 02:32:21 -08:00
|
|
|
|
2010-11-27 12:36:39 -08:00
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Fallback_Icon);
|
|
|
|
icon_fallback_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!icon_fallback_edd) return NULL;
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2010-11-27 12:36:39 -08:00
|
|
|
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY_STRING(icon_fallback_edd,
|
|
|
|
Efreet_Cache_Fallback_Icon, "icons", icons);
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
return icon_fallback_edd;
|
2010-11-16 02:32:21 -08:00
|
|
|
}
|
2010-11-15 13:07:22 -08:00
|
|
|
|
2010-11-23 12:14:13 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
|
|
|
EAPI Eet_Data_Descriptor *
|
2010-12-02 00:32:22 -08:00
|
|
|
efreet_desktop_edd(void)
|
2010-11-23 12:14:13 -08:00
|
|
|
{
|
2010-11-27 12:36:39 -08:00
|
|
|
Eet_Data_Descriptor_Class eddc;
|
|
|
|
|
|
|
|
if (desktop_edd) return desktop_edd;
|
|
|
|
|
2011-08-18 02:03:44 -07:00
|
|
|
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Desktop);
|
2010-11-27 12:36:39 -08:00
|
|
|
desktop_edd = eet_data_descriptor_file_new(&eddc);
|
|
|
|
if (!desktop_edd) return NULL;
|
|
|
|
|
2011-08-18 02:03:44 -07:00
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "type", desktop.type, EET_T_INT);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "version", desktop.version, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "orig_path", desktop.orig_path, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "load_time", desktop.load_time, EET_T_LONG_LONG);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "name", desktop.name, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "generic_name", desktop.generic_name, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "comment", desktop.comment, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "icon", desktop.icon, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "try_exec", desktop.try_exec, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "exec", desktop.exec, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "path", desktop.path, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "startup_wm_class", desktop.startup_wm_class, EET_T_STRING);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "url", desktop.url, EET_T_STRING);
|
|
|
|
eet_data_descriptor_element_add(desktop_edd, "only_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.only_show_in), 0, NULL, NULL);
|
|
|
|
eet_data_descriptor_element_add(desktop_edd, "not_show_in", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.not_show_in), 0, NULL, NULL);
|
|
|
|
eet_data_descriptor_element_add(desktop_edd, "categories", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.categories), 0, NULL, NULL);
|
|
|
|
eet_data_descriptor_element_add(desktop_edd, "mime_types", EET_T_STRING, EET_G_LIST, offsetof(Efreet_Cache_Desktop, desktop.mime_types), 0, NULL, NULL);
|
|
|
|
eet_data_descriptor_element_add(desktop_edd, "x", EET_T_STRING, EET_G_HASH, offsetof(Efreet_Cache_Desktop, desktop.x), 0, NULL, NULL);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "no_display", desktop.no_display, EET_T_UCHAR);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "hidden", desktop.hidden, EET_T_UCHAR);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "terminal", desktop.terminal, EET_T_UCHAR);
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_BASIC(desktop_edd, Efreet_Cache_Desktop, "startup_notify", desktop.startup_notify, EET_T_UCHAR);
|
2010-11-27 12:36:39 -08:00
|
|
|
|
|
|
|
return desktop_edd;
|
2010-11-23 12:14:13 -08:00
|
|
|
}
|
|
|
|
|
2010-11-16 13:50:53 -08:00
|
|
|
Efreet_Cache_Icon *
|
|
|
|
efreet_cache_icon_find(Efreet_Icon_Theme *theme, const char *icon)
|
|
|
|
{
|
2011-02-01 13:03:40 -08:00
|
|
|
Efreet_Cache_Icon *cache = NULL;
|
|
|
|
|
2010-11-27 12:36:39 -08:00
|
|
|
if (theme_name && strcmp(theme_name, theme->name.internal))
|
|
|
|
{
|
2010-11-26 06:56:23 -08:00
|
|
|
/* FIXME: this is bad if people have pointer to this cache, things will go wrong */
|
2011-02-05 11:07:07 -08:00
|
|
|
INF("theme_name change from `%s` to `%s`", theme_name, theme->name.internal);
|
2010-12-12 14:17:05 -08:00
|
|
|
IF_RELEASE(theme_name);
|
2011-01-31 03:44:56 -08:00
|
|
|
icon_cache = efreet_cache_close(icon_cache);
|
2011-02-01 13:03:40 -08:00
|
|
|
eina_hash_free(icons);
|
|
|
|
icons = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_free));
|
2010-11-27 12:36:39 -08:00
|
|
|
}
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
if (!efreet_cache_check(&icon_cache, efreet_icon_cache_file(theme->name.internal), EFREET_ICON_CACHE_MAJOR)) return NULL;
|
2010-11-27 12:36:39 -08:00
|
|
|
if (!theme_name)
|
2011-01-31 03:44:56 -08:00
|
|
|
theme_name = eina_stringshare_add(theme->name.internal);
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2011-02-01 13:03:40 -08:00
|
|
|
cache = eina_hash_find(icons, icon);
|
|
|
|
if (cache == NON_EXISTING) return NULL;
|
|
|
|
if (cache) return cache;
|
|
|
|
|
|
|
|
cache = eet_data_read(icon_cache, efreet_icon_edd(), icon);
|
|
|
|
if (cache)
|
|
|
|
eina_hash_add(icons, icon, cache);
|
|
|
|
else
|
|
|
|
eina_hash_add(icons, icon, NON_EXISTING);
|
|
|
|
return cache;
|
2010-11-16 13:50:53 -08:00
|
|
|
}
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2010-11-26 06:56:23 -08:00
|
|
|
Efreet_Cache_Fallback_Icon *
|
2010-11-22 12:50:46 -08:00
|
|
|
efreet_cache_icon_fallback_find(const char *icon)
|
|
|
|
{
|
2011-02-01 13:03:40 -08:00
|
|
|
Efreet_Cache_Fallback_Icon *cache;
|
|
|
|
|
2011-01-31 03:44:56 -08:00
|
|
|
if (!efreet_cache_check(&fallback_cache, efreet_icon_cache_file(EFREET_CACHE_ICON_FALLBACK), EFREET_ICON_CACHE_MAJOR)) return NULL;
|
2010-11-26 06:56:23 -08:00
|
|
|
|
2011-02-01 13:03:40 -08:00
|
|
|
cache = eina_hash_find(fallbacks, icon);
|
|
|
|
if (cache == NON_EXISTING) return NULL;
|
|
|
|
if (cache) return cache;
|
|
|
|
|
|
|
|
cache = eet_data_read(fallback_cache, efreet_icon_fallback_edd(), icon);
|
|
|
|
if (cache)
|
|
|
|
eina_hash_add(fallbacks, icon, cache);
|
|
|
|
else
|
|
|
|
eina_hash_add(fallbacks, icon, NON_EXISTING);
|
|
|
|
return cache;
|
2010-11-22 12:50:46 -08:00
|
|
|
}
|
2010-12-09 00:56:56 -08:00
|
|
|
|
|
|
|
Efreet_Icon_Theme *
|
|
|
|
efreet_cache_icon_theme_find(const char *theme)
|
|
|
|
{
|
2011-02-09 09:09:16 -08:00
|
|
|
Efreet_Cache_Icon_Theme *cache;
|
|
|
|
|
2010-12-09 00:56:56 -08:00
|
|
|
if (!efreet_cache_check(&icon_theme_cache, efreet_icon_theme_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL;
|
2011-02-09 09:09:16 -08:00
|
|
|
|
|
|
|
cache = eina_hash_find(themes, theme);
|
|
|
|
if (cache == NON_EXISTING) return NULL;
|
|
|
|
if (cache) return &(cache->theme);
|
|
|
|
|
|
|
|
cache = eet_data_read(icon_theme_cache, efreet_icon_theme_edd(EINA_FALSE), theme);
|
|
|
|
if (cache)
|
2011-02-09 10:36:12 -08:00
|
|
|
{
|
2011-02-09 09:09:16 -08:00
|
|
|
eina_hash_add(themes, theme, cache);
|
2011-02-09 10:36:12 -08:00
|
|
|
return &(cache->theme);
|
|
|
|
}
|
2011-02-09 09:09:16 -08:00
|
|
|
else
|
|
|
|
eina_hash_add(themes, theme, NON_EXISTING);
|
2011-02-09 10:36:12 -08:00
|
|
|
return NULL;
|
2010-12-09 00:56:56 -08:00
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:20 -08:00
|
|
|
static void
|
|
|
|
efreet_cache_icon_free(Efreet_Cache_Icon *icon)
|
|
|
|
{
|
|
|
|
unsigned int i;
|
|
|
|
|
|
|
|
if (!icon) return;
|
|
|
|
if (icon == NON_EXISTING) return;
|
|
|
|
|
|
|
|
for (i = 0; i < icon->icons_count; ++i)
|
|
|
|
{
|
|
|
|
free(icon->icons[i]->paths);
|
|
|
|
free(icon->icons[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
free(icon->icons);
|
|
|
|
free(icon);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_cache_icon_fallback_free(Efreet_Cache_Fallback_Icon *icon)
|
|
|
|
{
|
|
|
|
if (!icon) return;
|
|
|
|
if (icon == NON_EXISTING) return;
|
|
|
|
|
|
|
|
free(icon->icons);
|
|
|
|
free(icon);
|
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:09 -08:00
|
|
|
static void
|
2010-12-09 00:56:56 -08:00
|
|
|
efreet_cache_icon_theme_free(Efreet_Icon_Theme *theme)
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
|
|
|
|
if (!theme) return;
|
2011-02-09 09:09:16 -08:00
|
|
|
if (theme == NON_EXISTING) return;
|
2010-12-09 00:56:56 -08:00
|
|
|
|
|
|
|
eina_list_free(theme->paths);
|
|
|
|
eina_list_free(theme->inherits);
|
|
|
|
EINA_LIST_FREE(theme->directories, data)
|
|
|
|
free(data);
|
|
|
|
|
|
|
|
free(theme);
|
|
|
|
}
|
|
|
|
|
2011-02-09 09:09:16 -08:00
|
|
|
Eina_List *
|
|
|
|
efreet_cache_icon_theme_list(void)
|
2010-12-09 00:56:56 -08:00
|
|
|
{
|
2011-02-09 09:09:16 -08:00
|
|
|
Eina_List *ret = NULL;
|
2010-12-09 00:56:56 -08:00
|
|
|
char **keys;
|
2011-02-09 09:09:16 -08:00
|
|
|
int i, num;
|
2010-12-09 00:56:56 -08:00
|
|
|
|
|
|
|
if (!efreet_cache_check(&icon_theme_cache, efreet_icon_theme_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL;
|
2011-02-09 09:09:16 -08:00
|
|
|
keys = eet_list(icon_theme_cache, "*", &num);
|
|
|
|
for (i = 0; i < num; i++)
|
2010-12-09 00:56:56 -08:00
|
|
|
{
|
2011-02-09 09:09:16 -08:00
|
|
|
Efreet_Icon_Theme *theme;
|
|
|
|
if (!strncmp(keys[i], "__efreet", 8)) continue;
|
2011-02-10 06:26:30 -08:00
|
|
|
|
|
|
|
theme = eina_hash_find(themes, keys[i]);
|
|
|
|
if (!theme)
|
|
|
|
theme = efreet_cache_icon_theme_find(keys[i]);
|
|
|
|
if (theme && theme != NON_EXISTING)
|
|
|
|
ret = eina_list_append(ret, theme);
|
2010-12-09 00:56:56 -08:00
|
|
|
}
|
2011-02-09 09:09:16 -08:00
|
|
|
free(keys);
|
|
|
|
return ret;
|
2010-12-09 00:56:56 -08:00
|
|
|
}
|
|
|
|
|
2011-02-07 13:19:36 -08:00
|
|
|
/*
|
|
|
|
* Needs EAPI because of helper binaries
|
|
|
|
*/
|
2011-01-31 03:32:34 -08:00
|
|
|
EAPI void
|
|
|
|
efreet_cache_array_string_free(Efreet_Cache_Array_String *array)
|
|
|
|
{
|
2011-02-02 14:57:34 -08:00
|
|
|
if (!array) return;
|
2011-01-31 03:32:34 -08:00
|
|
|
free(array->array);
|
|
|
|
free(array);
|
|
|
|
}
|
|
|
|
|
2010-11-23 12:14:13 -08:00
|
|
|
Efreet_Desktop *
|
|
|
|
efreet_cache_desktop_find(const char *file)
|
|
|
|
{
|
2011-08-18 02:03:44 -07:00
|
|
|
Efreet_Cache_Desktop *cache;
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2010-12-02 00:34:07 -08:00
|
|
|
if (!efreet_cache_check(&desktop_cache, efreet_desktop_cache_file(), EFREET_DESKTOP_CACHE_MAJOR)) return NULL;
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2012-10-18 01:10:35 -07:00
|
|
|
cache = eina_hash_find(desktops, file);
|
2011-02-10 06:25:44 -08:00
|
|
|
if (cache == NON_EXISTING) return NULL;
|
2011-08-18 02:03:44 -07:00
|
|
|
if (cache)
|
|
|
|
{
|
|
|
|
/* If less than one second since last stat, return desktop */
|
|
|
|
if ((ecore_time_get() - cache->check_time) < 1)
|
|
|
|
{
|
|
|
|
INF("Return without stat %f %f", ecore_time_get(), cache->check_time);
|
|
|
|
return &cache->desktop;
|
|
|
|
}
|
|
|
|
if (cache->desktop.load_time == ecore_file_mod_time(cache->desktop.orig_path))
|
|
|
|
{
|
|
|
|
INF("Return with stat %f %f", ecore_time_get(), cache->check_time);
|
|
|
|
cache->check_time = ecore_time_get();
|
|
|
|
return &cache->desktop;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* We got stale data. The desktop will be free'd eventually as
|
|
|
|
* users will call efreet_desktop_free */
|
2012-10-18 01:10:35 -07:00
|
|
|
eina_hash_set(desktops, file, NON_EXISTING);
|
2011-08-18 02:03:44 -07:00
|
|
|
cache = NULL;
|
|
|
|
}
|
2011-02-10 06:25:44 -08:00
|
|
|
|
2012-10-18 01:10:35 -07:00
|
|
|
cache = eet_data_read(desktop_cache, efreet_desktop_edd(), file);
|
2011-02-10 06:25:44 -08:00
|
|
|
if (cache)
|
|
|
|
{
|
2011-08-18 02:03:44 -07:00
|
|
|
if (cache->desktop.load_time != ecore_file_mod_time(cache->desktop.orig_path))
|
|
|
|
{
|
|
|
|
/* Don't return stale data */
|
|
|
|
INF("We got stale data in the desktop cache");
|
|
|
|
efreet_cache_desktop_free(&cache->desktop);
|
2012-10-18 01:10:35 -07:00
|
|
|
eina_hash_set(desktops, file, NON_EXISTING);
|
2011-08-18 02:03:44 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
cache->desktop.eet = 1;
|
|
|
|
cache->check_time = ecore_time_get();
|
|
|
|
eina_hash_set(desktops, cache->desktop.orig_path, cache);
|
|
|
|
return &cache->desktop;
|
|
|
|
}
|
2011-02-10 06:25:44 -08:00
|
|
|
}
|
|
|
|
else
|
2012-10-18 01:10:35 -07:00
|
|
|
eina_hash_set(desktops, file, NON_EXISTING);
|
2011-08-18 02:03:44 -07:00
|
|
|
return NULL;
|
2010-11-23 12:14:13 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
efreet_cache_desktop_free(Efreet_Desktop *desktop)
|
|
|
|
{
|
|
|
|
Efreet_Old_Cache *d;
|
|
|
|
Efreet_Desktop *curr;
|
|
|
|
Eina_List *l;
|
|
|
|
|
2011-02-10 06:25:44 -08:00
|
|
|
if (!desktop ||
|
|
|
|
desktop == NON_EXISTING ||
|
|
|
|
!desktop->eet) return;
|
|
|
|
|
|
|
|
curr = eina_hash_find(desktops, desktop->orig_path);
|
|
|
|
if (curr == desktop)
|
2011-08-18 02:03:44 -07:00
|
|
|
{
|
|
|
|
INF("Found in current cache, purge\n");
|
2011-02-10 06:25:44 -08:00
|
|
|
eina_hash_del_by_key(desktops, desktop->orig_path);
|
2011-08-18 02:03:44 -07:00
|
|
|
}
|
2010-11-23 12:14:13 -08:00
|
|
|
|
|
|
|
EINA_LIST_FOREACH(old_desktop_caches, l, d)
|
|
|
|
{
|
|
|
|
curr = eina_hash_find(d->hash, desktop->orig_path);
|
2011-08-18 02:03:44 -07:00
|
|
|
if (curr == desktop)
|
2010-11-23 12:14:13 -08:00
|
|
|
{
|
2011-08-18 00:34:40 -07:00
|
|
|
INF("Found in old cache, purge\n");
|
2010-11-23 12:14:13 -08:00
|
|
|
eina_hash_del_by_key(d->hash, desktop->orig_path);
|
|
|
|
if (eina_hash_population(d->hash) == 0)
|
|
|
|
{
|
2011-08-18 00:34:40 -07:00
|
|
|
INF("Cache empty, close file\n");
|
2010-11-23 12:14:13 -08:00
|
|
|
eina_hash_free(d->hash);
|
2011-08-18 00:34:40 -07:00
|
|
|
eet_close(d->ef);
|
|
|
|
free(d);
|
|
|
|
old_desktop_caches = eina_list_remove_list(old_desktop_caches, l);
|
2010-11-23 12:14:13 -08:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2011-02-10 06:25:44 -08:00
|
|
|
|
|
|
|
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);
|
|
|
|
free(desktop);
|
2010-11-23 12:14:13 -08:00
|
|
|
}
|
|
|
|
|
2011-02-10 06:25:23 -08:00
|
|
|
void
|
|
|
|
efreet_cache_desktop_add(Efreet_Desktop *desktop)
|
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
EDBus_Message *msg;
|
|
|
|
EDBus_Message_Iter *iter, *array_of_string;
|
2012-11-01 19:49:20 -07:00
|
|
|
char *path;
|
2011-02-10 06:25:23 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
if (!efreet_cache_update) return;
|
|
|
|
/* TODO: Chunk updates */
|
2012-11-01 19:49:20 -07:00
|
|
|
path = ecore_file_dir_get(desktop->orig_path);
|
2012-11-01 18:46:44 -07:00
|
|
|
msg = edbus_proxy_method_call_new(proxy, "AddDesktopDirs");
|
|
|
|
iter = edbus_message_iter_get(msg);
|
|
|
|
array_of_string = edbus_message_iter_container_new(iter, 'a',"s");
|
2012-11-01 19:49:20 -07:00
|
|
|
edbus_message_iter_basic_append(array_of_string, 's', path);
|
2012-11-01 18:46:44 -07:00
|
|
|
edbus_message_iter_container_close(iter, array_of_string);
|
|
|
|
edbus_proxy_send(proxy, msg, NULL, NULL, -1);
|
|
|
|
edbus_message_unref(msg);
|
2012-11-01 19:49:20 -07:00
|
|
|
free(path);
|
2011-02-10 06:25:23 -08:00
|
|
|
}
|
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
void
|
|
|
|
efreet_cache_icon_exts_add(Eina_List *exts)
|
2011-02-10 06:25:23 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
EDBus_Message *msg;
|
|
|
|
EDBus_Message_Iter *iter, *array_of_string;
|
|
|
|
Eina_List *l;
|
|
|
|
const char *ext;
|
2011-02-10 06:25:23 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
if (!efreet_cache_update) return;
|
|
|
|
msg = edbus_proxy_method_call_new(proxy, "AddIconExts");
|
|
|
|
iter = edbus_message_iter_get(msg);
|
|
|
|
array_of_string = edbus_message_iter_container_new(iter, 'a',"s");
|
|
|
|
EINA_LIST_FOREACH(exts, l, ext)
|
|
|
|
edbus_message_iter_basic_append(array_of_string, 's', ext);
|
|
|
|
edbus_message_iter_container_close(iter, array_of_string);
|
|
|
|
edbus_proxy_send(proxy, msg, NULL, NULL, -1);
|
|
|
|
edbus_message_unref(msg);
|
2011-02-10 06:25:23 -08:00
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:20 -08:00
|
|
|
void
|
2012-11-01 18:46:44 -07:00
|
|
|
efreet_cache_icon_dirs_add(Eina_List *dirs)
|
2011-02-10 06:24:20 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
EDBus_Message *msg;
|
|
|
|
EDBus_Message_Iter *iter, *array_of_string;
|
|
|
|
Eina_List *l;
|
|
|
|
const char *dir;
|
2011-02-10 06:24:20 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
if (!efreet_cache_update) return;
|
|
|
|
msg = edbus_proxy_method_call_new(proxy, "AddIconDirs");
|
|
|
|
iter = edbus_message_iter_get(msg);
|
|
|
|
array_of_string = edbus_message_iter_container_new(iter, 'a',"s");
|
|
|
|
EINA_LIST_FOREACH(dirs, l, dir)
|
|
|
|
edbus_message_iter_basic_append(array_of_string, 's', dir);
|
|
|
|
edbus_message_iter_container_close(iter, array_of_string);
|
|
|
|
edbus_proxy_send(proxy, msg, NULL, NULL, -1);
|
|
|
|
edbus_message_unref(msg);
|
2011-02-10 06:24:20 -08:00
|
|
|
}
|
|
|
|
|
2012-08-08 12:39:55 -07:00
|
|
|
void
|
|
|
|
efreet_cache_desktop_close(void)
|
|
|
|
{
|
|
|
|
IF_RELEASE(util_cache_names_key);
|
|
|
|
IF_RELEASE(util_cache_hash_key);
|
|
|
|
|
|
|
|
if ((desktop_cache) && (desktop_cache != NON_EXISTING))
|
|
|
|
{
|
|
|
|
Efreet_Old_Cache *d = NEW(Efreet_Old_Cache, 1);
|
|
|
|
if (d)
|
|
|
|
{
|
|
|
|
d->hash = desktops;
|
|
|
|
d->ef = desktop_cache;
|
|
|
|
old_desktop_caches = eina_list_append(old_desktop_caches, d);
|
|
|
|
}
|
|
|
|
|
|
|
|
desktops = eina_hash_string_superfast_new(NULL);
|
|
|
|
}
|
|
|
|
desktop_cache = NULL;
|
|
|
|
|
|
|
|
efreet_cache_array_string_free(util_cache_names);
|
|
|
|
util_cache_names = NULL;
|
|
|
|
|
|
|
|
if (util_cache_hash)
|
|
|
|
{
|
|
|
|
eina_hash_free(util_cache_hash->hash);
|
|
|
|
free(util_cache_hash);
|
|
|
|
util_cache_hash = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
util_cache = efreet_cache_close(util_cache);
|
|
|
|
|
|
|
|
IF_RELEASE(desktop_cache_file);
|
|
|
|
IF_RELEASE(util_cache_file);
|
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:20 -08:00
|
|
|
void
|
2012-11-01 18:46:44 -07:00
|
|
|
efreet_cache_desktop_build(void)
|
2011-02-10 06:24:20 -08:00
|
|
|
{
|
|
|
|
if (!efreet_cache_update) return;
|
2012-11-26 08:07:55 -08:00
|
|
|
if (proxy)
|
|
|
|
edbus_proxy_call(proxy, "BuildDesktopCache", NULL, NULL, -1, "s", efreet_language_get());
|
2011-02-10 06:24:20 -08:00
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
static Eina_Bool
|
2010-12-02 00:34:07 -08:00
|
|
|
efreet_cache_check(Eet_File **ef, const char *path, int major)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Version *version;
|
|
|
|
|
|
|
|
if (*ef == NON_EXISTING) return EINA_FALSE;
|
2010-12-09 04:19:23 -08:00
|
|
|
if (*ef) return EINA_TRUE;
|
2010-12-02 00:34:07 -08:00
|
|
|
if (!*ef)
|
|
|
|
*ef = eet_open(path, EET_FILE_MODE_READ);
|
|
|
|
if (!*ef)
|
|
|
|
{
|
|
|
|
*ef = NON_EXISTING;
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
version = eet_data_read(*ef, efreet_version_edd(), EFREET_CACHE_VERSION);
|
|
|
|
if ((!version) || (version->major != major))
|
|
|
|
{
|
|
|
|
IF_FREE(version);
|
|
|
|
eet_close(*ef);
|
|
|
|
*ef = NON_EXISTING;
|
|
|
|
return EINA_FALSE;
|
|
|
|
}
|
|
|
|
free(version);
|
|
|
|
return EINA_TRUE;
|
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
static void *
|
2010-12-02 00:34:07 -08:00
|
|
|
efreet_cache_close(Eet_File *ef)
|
|
|
|
{
|
|
|
|
if (ef && ef != NON_EXISTING)
|
|
|
|
eet_close(ef);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2011-02-10 06:24:40 -08:00
|
|
|
Efreet_Cache_Hash *
|
|
|
|
efreet_cache_util_hash_string(const char *key)
|
|
|
|
{
|
|
|
|
if (util_cache_hash_key && !strcmp(key, util_cache_hash_key))
|
|
|
|
return util_cache_hash;
|
|
|
|
if (!efreet_cache_check(&util_cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL;
|
|
|
|
|
|
|
|
if (util_cache_hash)
|
|
|
|
{
|
|
|
|
/* free previous util_cache */
|
|
|
|
IF_RELEASE(util_cache_hash_key);
|
|
|
|
eina_hash_free(util_cache_hash->hash);
|
|
|
|
free(util_cache_hash);
|
|
|
|
}
|
|
|
|
util_cache_hash_key = eina_stringshare_add(key);
|
|
|
|
util_cache_hash = eet_data_read(util_cache, efreet_hash_string_edd(), key);
|
|
|
|
return util_cache_hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
Efreet_Cache_Hash *
|
|
|
|
efreet_cache_util_hash_array_string(const char *key)
|
|
|
|
{
|
|
|
|
if (util_cache_hash_key && !strcmp(key, util_cache_hash_key))
|
|
|
|
return util_cache_hash;
|
|
|
|
if (!efreet_cache_check(&util_cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL;
|
|
|
|
|
|
|
|
IF_RELEASE(util_cache_hash_key);
|
|
|
|
if (util_cache_hash)
|
|
|
|
{
|
|
|
|
/* free previous cache */
|
|
|
|
eina_hash_free(util_cache_hash->hash);
|
|
|
|
free(util_cache_hash);
|
|
|
|
}
|
|
|
|
util_cache_hash_key = eina_stringshare_add(key);
|
|
|
|
util_cache_hash = eet_data_read(util_cache, efreet_hash_array_string_edd(), key);
|
|
|
|
return util_cache_hash;
|
|
|
|
}
|
|
|
|
|
|
|
|
Efreet_Cache_Array_String *
|
|
|
|
efreet_cache_util_names(const char *key)
|
|
|
|
{
|
|
|
|
if (util_cache_names_key && !strcmp(key, util_cache_names_key))
|
|
|
|
return util_cache_names;
|
|
|
|
if (!efreet_cache_check(&util_cache, efreet_desktop_util_cache_file(), EFREET_DESKTOP_UTILS_CACHE_MAJOR)) return NULL;
|
|
|
|
|
|
|
|
if (util_cache_names)
|
|
|
|
{
|
|
|
|
/* free previous util_cache */
|
|
|
|
IF_RELEASE(util_cache_names_key);
|
|
|
|
efreet_cache_array_string_free(util_cache_names);
|
|
|
|
}
|
|
|
|
util_cache_names_key = eina_stringshare_add(key);
|
|
|
|
util_cache_names = eet_data_read(util_cache, efreet_array_string_edd(), key);
|
|
|
|
return util_cache_names;
|
|
|
|
}
|
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
static void
|
2012-11-02 13:12:41 -07:00
|
|
|
on_send_register(void *data __UNUSED__, const EDBus_Message *msg, EDBus_Pending *pending __UNUSED__)
|
2010-11-22 06:16:09 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
const char *errname, *errmsg;
|
2012-11-01 18:47:06 -07:00
|
|
|
Eina_Bool exists;
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
if (edbus_message_error_get(msg, &errname, &errmsg))
|
2010-11-23 12:14:13 -08:00
|
|
|
{
|
2012-12-07 05:25:14 -08:00
|
|
|
Efreet_Event_Cache_Update *ev = NULL;
|
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
ERR("%s %s", errname, errmsg);
|
2012-12-07 05:25:14 -08:00
|
|
|
|
|
|
|
ev = NEW(Efreet_Event_Cache_Update, 1);
|
|
|
|
if (ev)
|
|
|
|
{
|
|
|
|
ev->error = 1;
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CACHE_BUILD, ev, NULL, NULL);
|
|
|
|
}
|
2010-11-23 12:26:50 -08:00
|
|
|
}
|
2012-12-07 05:25:14 -08:00
|
|
|
else if (edbus_message_arguments_get(msg, "b", &exists) && exists)
|
2012-11-01 18:47:06 -07:00
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CACHE_BUILD, NULL, NULL, NULL);
|
2011-08-16 05:46:35 -07:00
|
|
|
}
|
|
|
|
|
2010-11-22 06:16:09 -08:00
|
|
|
static void
|
2012-11-01 18:46:44 -07:00
|
|
|
desktop_cache_update(void *context __UNUSED__, const EDBus_Message *msg)
|
2010-11-22 06:16:09 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
Eina_Bool update;
|
2010-11-22 06:16:09 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
if (edbus_message_arguments_get(msg, "b", &update))
|
2010-11-23 12:14:13 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
if (update)
|
2011-08-16 05:46:35 -07:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
Efreet_Event_Cache_Update *ev = NULL;
|
2012-07-02 01:17:02 -07:00
|
|
|
|
2012-08-08 12:39:55 -07:00
|
|
|
efreet_cache_desktop_close();
|
2012-06-25 13:54:46 -07:00
|
|
|
|
2011-08-18 00:34:02 -07:00
|
|
|
ev = NEW(Efreet_Event_Cache_Update, 1);
|
2012-11-01 18:46:44 -07:00
|
|
|
if (ev)
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CACHE_UPDATE, ev, NULL, NULL);
|
2011-08-18 00:34:02 -07:00
|
|
|
}
|
2012-11-01 18:46:44 -07:00
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CACHE_BUILD, NULL, NULL, NULL);
|
2010-11-27 12:36:39 -08:00
|
|
|
}
|
2010-11-22 06:16:09 -08:00
|
|
|
}
|
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
static void
|
|
|
|
icon_cache_update(void *context __UNUSED__, const EDBus_Message *msg)
|
2010-11-23 12:14:13 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
Efreet_Event_Cache_Update *ev = NULL;
|
|
|
|
Efreet_Old_Cache *d = NULL;
|
|
|
|
Eina_List *l = NULL;
|
|
|
|
Eina_Bool update;
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
if (edbus_message_arguments_get(msg, "b", &update) && update)
|
2011-02-02 14:58:15 -08:00
|
|
|
{
|
2012-11-01 18:46:44 -07:00
|
|
|
ev = NEW(Efreet_Event_Cache_Update, 1);
|
|
|
|
if (!ev) goto error;
|
2011-02-02 14:58:15 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
IF_RELEASE(theme_name);
|
2011-02-02 14:58:15 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
/* Save all old caches */
|
|
|
|
d = NEW(Efreet_Old_Cache, 1);
|
|
|
|
if (!d) goto error;
|
|
|
|
d->hash = themes;
|
|
|
|
d->ef = icon_theme_cache;
|
|
|
|
l = eina_list_append(l, d);
|
|
|
|
|
|
|
|
d = NEW(Efreet_Old_Cache, 1);
|
|
|
|
if (!d) goto error;
|
|
|
|
d->hash = icons;
|
|
|
|
d->ef = icon_cache;
|
|
|
|
l = eina_list_append(l, d);
|
|
|
|
|
|
|
|
d = NEW(Efreet_Old_Cache, 1);
|
|
|
|
if (!d) goto error;
|
|
|
|
d->hash = fallbacks;
|
|
|
|
d->ef = fallback_cache;
|
|
|
|
l = eina_list_append(l, d);
|
|
|
|
|
|
|
|
/* Create new empty caches */
|
|
|
|
themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free));
|
|
|
|
icons = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_free));
|
|
|
|
fallbacks = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_fallback_free));
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
icon_theme_cache = NULL;
|
|
|
|
icon_cache = NULL;
|
|
|
|
fallback_cache = NULL;
|
2010-11-23 12:14:13 -08:00
|
|
|
|
2012-11-01 18:46:44 -07:00
|
|
|
/* Send event */
|
|
|
|
ecore_event_add(EFREET_EVENT_ICON_CACHE_UPDATE, ev, icon_cache_update_free, l);
|
2010-11-23 12:14:13 -08:00
|
|
|
}
|
2012-11-01 18:46:44 -07:00
|
|
|
return;
|
|
|
|
error:
|
|
|
|
IF_FREE(ev);
|
|
|
|
EINA_LIST_FREE(l, d)
|
|
|
|
free(d);
|
2010-11-23 12:14:13 -08:00
|
|
|
}
|
|
|
|
|
2010-12-11 12:37:17 -08:00
|
|
|
static void
|
|
|
|
icon_cache_update_free(void *data, void *ev)
|
|
|
|
{
|
|
|
|
Efreet_Old_Cache *d;
|
2011-02-09 09:09:16 -08:00
|
|
|
Eina_List *l;
|
2010-12-11 12:37:17 -08:00
|
|
|
|
2011-02-09 09:09:16 -08:00
|
|
|
l = data;
|
|
|
|
EINA_LIST_FREE(l, d)
|
|
|
|
{
|
|
|
|
if (d->hash)
|
|
|
|
eina_hash_free(d->hash);
|
|
|
|
efreet_cache_close(d->ef);
|
|
|
|
free(d);
|
|
|
|
}
|
2010-12-11 12:37:17 -08:00
|
|
|
free(ev);
|
|
|
|
}
|
2011-02-09 09:09:38 -08:00
|
|
|
|
|
|
|
static void *
|
|
|
|
hash_array_string_add(void *hash, const char *key, void *data)
|
|
|
|
{
|
|
|
|
if (!hash)
|
|
|
|
hash = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_array_string_free));
|
|
|
|
if (!hash)
|
|
|
|
return NULL;
|
|
|
|
eina_hash_add(hash, key, data);
|
|
|
|
return hash;
|
|
|
|
}
|