summaryrefslogtreecommitdiff
path: root/src/lib/efreet
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/efreet')
-rw-r--r--src/lib/efreet/Efreet.h9
-rw-r--r--src/lib/efreet/Efreet_Trash.h2
-rw-r--r--src/lib/efreet/efreet.c12
-rw-r--r--src/lib/efreet/efreet_base.c80
-rw-r--r--src/lib/efreet/efreet_cache.c202
-rw-r--r--src/lib/efreet/efreet_cache_private.h28
-rw-r--r--src/lib/efreet/efreet_desktop.c17
-rw-r--r--src/lib/efreet/efreet_icon.c2
-rw-r--r--src/lib/efreet/efreet_menu.c8
-rw-r--r--src/lib/efreet/efreet_mime.c40
-rw-r--r--src/lib/efreet/efreet_private.h8
-rw-r--r--src/lib/efreet/efreet_trash.c26
-rw-r--r--src/lib/efreet/efreet_uri.c70
-rw-r--r--src/lib/efreet/efreet_uri.h2
-rw-r--r--src/lib/efreet/meson.build69
15 files changed, 468 insertions, 107 deletions
diff --git a/src/lib/efreet/Efreet.h b/src/lib/efreet/Efreet.h
index 22d2291f44..6c39a1782e 100644
--- a/src/lib/efreet/Efreet.h
+++ b/src/lib/efreet/Efreet.h
@@ -11,7 +11,7 @@
/**
* @page efreet_main Efreet
*
- * @section toc Table of Contents
+ * @section efreet_toc Table of Contents
*
* @li @ref efreet_main_intro
* @li @ref efreet_main_compiling
@@ -123,9 +123,9 @@ extern "C" {
int micro; /** < micro (bugfix, internal improvements, no new features version) */
int revision; /** < git revision (0 if a proper release or the git revision number Efreet is built from) */
} Efreet_Version;
-
+
EAPI extern Efreet_Version *efreet_version;
-
+
#include "efreet_base.h"
#include "efreet_ini.h"
#include "efreet_icon.h"
@@ -167,6 +167,9 @@ EAPI void efreet_cache_disable(void);
*/
EAPI void efreet_cache_enable(void);
+#include <Efreet_Mime.h>
+#include <Efreet_Trash.h>
+
#undef EAPI
#define EAPI
diff --git a/src/lib/efreet/Efreet_Trash.h b/src/lib/efreet/Efreet_Trash.h
index 5ecf41d9be..67db071cae 100644
--- a/src/lib/efreet/Efreet_Trash.h
+++ b/src/lib/efreet/Efreet_Trash.h
@@ -67,7 +67,7 @@ EAPI const char *efreet_trash_dir_get(const char *for_file);
* will be deleted permanently
* @return @c 1 on success, @c 0 on failure or @c -1 in case the uri is not on
* the same filesystem and force_delete is not set.
- * @brief This function try to move the given uri to the trash. Files on
+ * @brief This function try to move the given uri to the trash. Files on
* different filesystem can't be moved to trash. If force_delete
* is @c 0 than non-local files will be ignored and @c -1 is returned, if you set
* force_delete to @c 1 non-local files will be deleted without asking.
diff --git a/src/lib/efreet/efreet.c b/src/lib/efreet/efreet.c
index 091899f2b2..4c20b12bc1 100644
--- a/src/lib/efreet/efreet.c
+++ b/src/lib/efreet/efreet.c
@@ -94,6 +94,12 @@ efreet_init(void)
if (!efreet_util_init())
goto shutdown_efreet_menu;
+ if (!efreet_internal_mime_init())
+ goto shutdown_efreet_mime;
+
+ if (!efreet_internal_trash_init())
+ goto shutdown_efreet_trash;
+
#ifdef ENABLE_NLS
bindtextdomain(PACKAGE, LOCALE_DIR);
bind_textdomain_codeset(PACKAGE, "UTF-8");
@@ -101,6 +107,10 @@ efreet_init(void)
return _efreet_init_count;
+shutdown_efreet_trash:
+ efreet_internal_trash_shutdown();
+shutdown_efreet_mime:
+ efreet_internal_mime_shutdown();
shutdown_efreet_menu:
efreet_menu_shutdown();
shutdown_efreet_desktop:
@@ -146,6 +156,8 @@ efreet_shutdown(void)
efreet_xml_shutdown();
efreet_cache_shutdown();
efreet_base_shutdown();
+ efreet_internal_mime_shutdown();
+ efreet_internal_trash_shutdown();
IF_RELEASE(efreet_lang);
IF_RELEASE(efreet_lang_country);
diff --git a/src/lib/efreet/efreet_base.c b/src/lib/efreet/efreet_base.c
index 6497e8d955..7b1490af46 100644
--- a/src/lib/efreet/efreet_base.c
+++ b/src/lib/efreet/efreet_base.c
@@ -51,6 +51,8 @@ static const char *xdg_pictures_dir = NULL;
static const char *xdg_videos_dir = NULL;
static const char *hostname = NULL;
+static Eina_Prefix *pfx= NULL;
+
static void efreet_dirs_init(void);
static const char *efreet_dir_get(const char *key, const char *fallback);
static Eina_List *efreet_dirs_get(const char *key,
@@ -72,6 +74,9 @@ efreet_base_init(void)
EINA_LOG_ERR("Efreet: Could not create a log domain for efreet_base.\n");
return 0;
}
+ if (!pfx) pfx = eina_prefix_new
+ (NULL, efreet_init, "EFREET", "efreet", "checkme",
+ PACKAGE_BIN_DIR, PACKAGE_LIB_DIR, PACKAGE_DATA_DIR, PACKAGE_DATA_DIR);
efreet_dirs_init();
return 1;
}
@@ -105,6 +110,11 @@ efreet_base_shutdown(void)
IF_RELEASE(hostname);
+ if (pfx)
+ {
+ eina_prefix_free(pfx);
+ pfx = NULL;
+ }
eina_log_domain_unregister(_efreet_base_log_dom);
_efreet_base_log_dom = -1;
}
@@ -124,7 +134,13 @@ EAPI const char *
efreet_desktop_dir_get(void)
{
if (xdg_desktop_dir) return xdg_desktop_dir;
- xdg_desktop_dir = efreet_user_dir_get("XDG_DESKTOP_DIR", _("Desktop"));
+ xdg_desktop_dir = efreet_user_dir_get("XDG_DESKTOP_DIR",
+#ifdef _WIN32
+ "Desktop"
+#else
+ _("Desktop")
+#endif
+ );
return xdg_desktop_dir;
}
@@ -132,7 +148,13 @@ EAPI const char *
efreet_download_dir_get(void)
{
if (xdg_download_dir) return xdg_download_dir;
- xdg_download_dir = efreet_user_dir_get("XDG_DOWNLOAD_DIR", _("Downloads"));
+ xdg_download_dir = efreet_user_dir_get("XDG_DOWNLOAD_DIR",
+#ifdef _WIN32
+ "Downloads"
+#else
+ _("Downloads")
+#endif
+ );
return xdg_download_dir;
}
@@ -141,7 +163,12 @@ efreet_templates_dir_get(void)
{
if (xdg_templates_dir) return xdg_templates_dir;
xdg_templates_dir = efreet_user_dir_get("XDG_TEMPLATES_DIR",
- _("Templates"));
+#ifdef _WIN32
+ "Templates"
+#else
+ _("Templates")
+#endif
+ );
return xdg_templates_dir;
}
@@ -167,7 +194,13 @@ EAPI const char *
efreet_music_dir_get(void)
{
if (xdg_music_dir) return xdg_music_dir;
- xdg_music_dir = efreet_user_dir_get("XDG_MUSIC_DIR", _("Music"));
+ xdg_music_dir = efreet_user_dir_get("XDG_MUSIC_DIR",
+#ifdef _WIN32
+ "Music"
+#else
+ _("Music")
+#endif
+ );
return xdg_music_dir;
}
@@ -175,7 +208,13 @@ EAPI const char *
efreet_pictures_dir_get(void)
{
if (xdg_pictures_dir) return xdg_pictures_dir;
- xdg_pictures_dir = efreet_user_dir_get("XDG_PICTURES_DIR", _("Pictures"));
+ xdg_pictures_dir = efreet_user_dir_get("XDG_PICTURES_DIR",
+#ifdef _WIN32
+ "Pictures"
+#else
+ _("Pictures")
+#endif
+ );
return xdg_pictures_dir;
}
@@ -183,7 +222,13 @@ EAPI const char *
efreet_videos_dir_get(void)
{
if (xdg_videos_dir) return xdg_videos_dir;
- xdg_videos_dir = efreet_user_dir_get("XDG_VIDEOS_DIR", _("Videos"));
+ xdg_videos_dir = efreet_user_dir_get("XDG_VIDEOS_DIR",
+#ifdef _WIN32
+ "Videos"
+#else
+ _("Videos")
+#endif
+ );
return xdg_videos_dir;
}
@@ -280,6 +325,7 @@ efreet_dirs_reset(void)
static void
efreet_dirs_init(void)
{
+ char *data_dir = DATA_DIR;
char buf[PATH_MAX];
/* efreet_home_dir */
@@ -294,13 +340,27 @@ efreet_dirs_init(void)
xdg_cache_home = efreet_dir_get("XDG_CACHE_HOME", "/.cache");
/* xdg_data_dirs */
+ if (pfx)
+ {
+ const char *dir = eina_prefix_get(pfx);
+ if (dir)
+ {
+ size_t len = strlen(dir);
+
+ data_dir = alloca(len + 1 + 5 /*"share" */ + 1);
#ifdef _WIN32
- snprintf(buf, sizeof(buf), "%s\\Efl;" DATA_DIR ";", getenv("APPDATA"));
- xdg_data_dirs = efreet_dirs_get("XDG_DATA_DIRS", buf);
+ snprintf(data_dir, len + 1 + 5 + 1, "%s\\share", dir);
#else
- xdg_data_dirs = efreet_dirs_get("XDG_DATA_DIRS",
- DATA_DIR ":/usr/share:/usr/local/share");
+ snprintf(data_dir, len + 1 + 5 + 1, "%s/share", dir);
#endif
+ }
+ }
+#ifdef _WIN32
+ snprintf(buf, sizeof(buf), "%s\\Efl;%s;", data_dir, getenv("APPDATA"));
+#else
+ snprintf(buf, sizeof(buf), "%s:/usr/share:/usr/local/share", data_dir);
+#endif
+ xdg_data_dirs = efreet_dirs_get("XDG_DATA_DIRS", buf);
/* xdg_config_dirs */
#ifdef _WIN32
xdg_config_dirs = efreet_dirs_get("XDG_CONFIG_DIRS", getenv("APPDATA"));
diff --git a/src/lib/efreet/efreet_cache.c b/src/lib/efreet/efreet_cache.c
index 883cf5e3c2..a801081ce9 100644
--- a/src/lib/efreet/efreet_cache.c
+++ b/src/lib/efreet/efreet_cache.c
@@ -1,3 +1,4 @@
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -101,6 +102,7 @@ static void *hash_array_string_add(void *hash, const char *key, void *data);
static Eina_Bool disable_cache;
static Eina_Bool run_in_tree;
+static int relaunch_try = 0;
EAPI int EFREET_EVENT_ICON_CACHE_UPDATE = 0;
EAPI int EFREET_EVENT_DESKTOP_CACHE_UPDATE = 0;
@@ -117,9 +119,19 @@ _ipc_launch(void)
char buf[PATH_MAX];
int num;
int try_gap = 10000; // 10ms
- int tries = 200; // 200 * 10ms == 2sec
+ int tries = 1000; // 1000 * 10ms == 10sec
const char *s;
+ if (relaunch_try == 0)
+ {
+ ipc = ecore_ipc_server_connect(ECORE_IPC_LOCAL_USER, "efreetd", 0, NULL);
+ if (ipc)
+ {
+ relaunch_try++;
+ return;
+ }
+ }
+ relaunch_try--;
s = getenv("EFREETD_CONNECT_TRIES");
if (s)
{
@@ -151,6 +163,7 @@ static Eina_Bool
_cb_server_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
{
IPC_HEAD(Add);
+ relaunch_try--;
return ECORE_CALLBACK_DONE;
}
@@ -180,7 +193,6 @@ _cb_server_reconnect(void *data EINA_UNUSED)
static Eina_Bool
_cb_server_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
{
- static double last_del = 0.0;
double t;
IPC_HEAD(Del);
ipc = NULL;
@@ -194,15 +206,10 @@ _cb_server_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
free(address);
return EINA_FALSE;
}
- t = ecore_time_get();
- if ((t - last_del) < 0.5)
- {
- if (reconnect_timer) ecore_timer_del(reconnect_timer);
- reconnect_timer = ecore_timer_add(0.5, _cb_server_reconnect, NULL);
- }
- else
- _cb_server_reconnect(NULL);
- last_del = t;
+ // random 0.5 -> 1.0 sec from now
+ t = (((double)((rand() + (int)getpid()) & 0xff) / 255.0) * 0.5) + 0.5;
+ if (reconnect_timer) ecore_timer_del(reconnect_timer);
+ reconnect_timer = ecore_timer_add(t, _cb_server_reconnect, NULL);
return ECORE_CALLBACK_DONE;
}
@@ -530,6 +537,145 @@ efreet_desktop_util_cache_file(void)
/*
* Needs EAPI because of helper binaries
*/
+#define SHSH(n, v) ((((v) << (n)) & 0xffffffff) | ((v) >> (32 - (n))))
+
+static inline int
+int_to_bigendian(int in)
+{
+ static const unsigned char test[4] = { 0x11, 0x22, 0x33, 0x44 };
+ static const unsigned int *test_i = (const unsigned int *)test;
+ if (test_i[0] == 0x44332211) return eina_swap32(in);
+ return in;
+}
+
+static void
+sha1(unsigned char *data, int size, unsigned char *dst)
+{
+ unsigned int digest[5], word[80], wa, wb, wc, wd, we, t;
+ unsigned char buf[64], *d;
+ int idx, left, i;
+ const unsigned int magic[4] =
+ { 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 };
+
+ idx = 0;
+ digest[0] = 0x67452301; digest[1] = 0xefcdab89; digest[2] = 0x98badcfe;
+ digest[3] = 0x10325476; digest[4] = 0xc3d2e1f0;
+
+ memset(buf, 0, sizeof(buf));
+ for (left = size, d = data; left > 0; left--, d++)
+ {
+ if ((idx == 0) && (left < 64))
+ {
+ memset(buf, 0, 60);
+ buf[60] = (size >> 24) & 0xff;
+ buf[61] = (size >> 16) & 0xff;
+ buf[62] = (size >> 8) & 0xff;
+ buf[63] = (size) & 0xff;
+ }
+ buf[idx] = *d;
+ idx++;
+ if ((idx == 64) || (left == 1))
+ {
+ if ((left == 1) && (idx < 64)) buf[idx] = 0x80;
+ for (i = 0; i < 16; i++)
+ {
+ word[i] = (unsigned int)buf[(i * 4) ] << 24;
+ word[i] |= (unsigned int)buf[(i * 4) + 1] << 16;
+ word[i] |= (unsigned int)buf[(i * 4) + 2] << 8;
+ word[i] |= (unsigned int)buf[(i * 4) + 3];
+ }
+ for (i = 16; i < 80; i++)
+ word[i] = SHSH(1,
+ word[i - 3 ] ^ word[i - 8 ] ^
+ word[i - 14] ^ word[i - 16]);
+ wa = digest[0]; wb = digest[1]; wc = digest[2];
+ wd = digest[3]; we = digest[4];
+ for (i = 0; i < 80; i++)
+ {
+ if (i < 20)
+ t = SHSH(5, wa) + ((wb & wc) | ((~wb) & wd)) +
+ we + word[i] + magic[0];
+ else if (i < 40)
+ t = SHSH(5, wa) + (wb ^ wc ^ wd) +
+ we + word[i] + magic[1];
+ else if (i < 60)
+ t = SHSH(5, wa) + ((wb & wc) | (wb & wd) | (wc & wd)) +
+ we + word[i] + magic[2];
+ else if (i < 80)
+ t = SHSH(5, wa) + (wb ^ wc ^ wd) +
+ we + word[i] + magic[3];
+ we = wd;
+ wd = wc;
+ wc = SHSH(30, wb);
+ wb = wa;
+ wa = t;
+ }
+ digest[0] += wa; digest[1] += wb; digest[2] += wc;
+ digest[3] += wd; digest[4] += we;
+ idx = 0;
+ }
+ }
+ t = int_to_bigendian(digest[0]); digest[0] = t;
+ t = int_to_bigendian(digest[1]); digest[1] = t;
+ t = int_to_bigendian(digest[2]); digest[2] = t;
+ t = int_to_bigendian(digest[3]); digest[3] = t;
+ t = int_to_bigendian(digest[4]); digest[4] = t;
+ memcpy(dst, digest, 5 * 4);
+}
+
+EAPI Eina_Bool
+efreet_file_cache_fill(const char *file, Efreet_Cache_Check *check)
+{
+ struct stat st;
+
+ memset(check, 0, sizeof(Efreet_Cache_Check));
+#ifdef _WIN32
+ if (stat(file, &st) != 0) return EINA_FALSE;
+#else
+ ssize_t size = 0;
+
+ if (lstat(file, &st) != 0) return EINA_FALSE;
+ if (S_ISLNK(st.st_mode))
+ {
+ char link[PATH_MAX];
+
+ size = readlink(file, link, sizeof(link));
+ if ((size > 0) && ((size_t)size >= sizeof(link))) return EINA_FALSE;
+ if (stat(file, &st) != 0) return EINA_FALSE;
+ }
+ if (size > 0) sha1((unsigned char *)link, size, check->link_sha1);
+#endif
+ check->uid = st.st_uid;
+ check->gid = st.st_gid;
+ check->size = st.st_size;
+#ifndef _WIN32
+ check->blocks = st.st_blocks;
+#else
+ check->blocks = 0;
+#endif
+ check->mtime = st.st_mtime;
+ check->chtime = st.st_ctime;
+ check->mode = st.st_mode;
+ return EINA_TRUE;
+}
+
+EAPI Eina_Bool // true if matches
+efreet_file_cache_check(const Efreet_Cache_Check *check1, const Efreet_Cache_Check *check2)
+{
+ if ((check1->mtime != check2->mtime ) ||
+ (check1->size != check2->size ) ||
+ (check1->chtime != check2->chtime ) ||
+ (check1->blocks != check2->blocks) ||
+ (check1->mode != check2->mode ) ||
+ (check1->uid != check2->uid ) ||
+ (check1->gid != check2->gid ) ||
+ (memcmp(check1->link_sha1, check2->link_sha1, 20) != 0))
+ {
+ return EINA_FALSE;
+ }
+ return EINA_TRUE; // matches
+}
+
EAPI Eet_Data_Descriptor *
efreet_version_edd(void)
{
@@ -685,8 +831,22 @@ efreet_icon_directory_edd(void)
directory_edd = eet_data_descriptor_file_new(&eddc);
if (!directory_edd) return NULL;
- EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
- "modified_time", modified_time, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.uid", check.uid, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.gid", check.gid, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.size", check.size, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.blocks", check.blocks, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.mtime", check.mtime, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.chtime", check.chtime, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(directory_edd, Efreet_Cache_Directory,
+ "check.mode", check.mode, EET_T_INT);
+ EET_DATA_DESCRIPTOR_ADD_BASIC_ARRAY(directory_edd, Efreet_Cache_Directory,
+ "check.link_sha1", check.link_sha1, EET_T_CHAR);
return directory_edd;
}
@@ -784,7 +944,21 @@ efreet_icon_theme_edd(Eina_Bool cache)
if (cache)
{
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
- "last_cache_check", last_cache_check, EET_T_LONG_LONG);
+ "check.uid", check.uid, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.gid", check.gid, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.size", check.size, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.blocks", check.blocks, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.mtime", check.mtime, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.chtime", check.chtime, EET_T_LONG_LONG);
+ EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.mode", check.mode, EET_T_INT);
+ EET_DATA_DESCRIPTOR_ADD_BASIC_ARRAY(icon_theme_edd, Efreet_Cache_Icon_Theme,
+ "check.link_sha1", check.link_sha1, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
"path", path, EET_T_STRING);
diff --git a/src/lib/efreet/efreet_cache_private.h b/src/lib/efreet/efreet_cache_private.h
index 97dbd45a1e..1edbb3b5ff 100644
--- a/src/lib/efreet/efreet_cache_private.h
+++ b/src/lib/efreet/efreet_cache_private.h
@@ -38,11 +38,20 @@
# endif
#endif
+typedef struct _Efreet_Cache_Check Efreet_Cache_Check;
+
+typedef struct _Efreet_Cache_Icon_Theme Efreet_Cache_Icon_Theme;
+typedef struct _Efreet_Cache_Directory Efreet_Cache_Directory;
+typedef struct _Efreet_Cache_Desktop Efreet_Cache_Desktop;
+
EAPI const char *efreet_desktop_util_cache_file(void);
EAPI const char *efreet_desktop_cache_file(void);
EAPI const char *efreet_icon_cache_file(const char *theme);
EAPI const char *efreet_icon_theme_cache_file(void);
+EAPI Eina_Bool efreet_file_cache_fill(const char *file, Efreet_Cache_Check *check);
+EAPI Eina_Bool efreet_file_cache_check(const Efreet_Cache_Check *check1, const Efreet_Cache_Check *check2);
+
EAPI Eet_Data_Descriptor *efreet_version_edd(void);
EAPI Eet_Data_Descriptor *efreet_desktop_edd(void);
EAPI Eet_Data_Descriptor *efreet_hash_array_string_edd(void);
@@ -52,15 +61,23 @@ EAPI Eet_Data_Descriptor *efreet_icon_theme_edd(Eina_Bool cache);
EAPI Eet_Data_Descriptor *efreet_icon_edd(void);
EAPI Eet_Data_Descriptor *efreet_icon_fallback_edd(void);
-typedef struct _Efreet_Cache_Icon_Theme Efreet_Cache_Icon_Theme;
-typedef struct _Efreet_Cache_Directory Efreet_Cache_Directory;
-typedef struct _Efreet_Cache_Desktop Efreet_Cache_Desktop;
+struct _Efreet_Cache_Check
+{
+ unsigned long long uid;
+ unsigned long long gid;
+ unsigned long long size;
+ unsigned long long blocks;
+ unsigned long long mtime;
+ unsigned long long chtime;
+ unsigned int mode;
+ unsigned char link_sha1[20];
+};
struct _Efreet_Cache_Icon_Theme
{
Efreet_Icon_Theme theme;
- long long last_cache_check; /**< Last time the cache was checked */
+ Efreet_Cache_Check check; /**< relevant stat info from last check */
Eina_Hash *dirs; /**< All possible icon paths for this theme */
@@ -73,13 +90,14 @@ struct _Efreet_Cache_Icon_Theme
struct _Efreet_Cache_Directory
{
- long long modified_time;
+ Efreet_Cache_Check check; /**< relevant stat info from last check */
};
struct _Efreet_Cache_Desktop
{
Efreet_Desktop desktop;
+ Efreet_Cache_Check check; /**< relevant stat info from last check */
double check_time; /**< Last time we check for disk modification */
};
diff --git a/src/lib/efreet/efreet_desktop.c b/src/lib/efreet/efreet_desktop.c
index f0c46d4c33..4e97dc1efb 100644
--- a/src/lib/efreet/efreet_desktop.c
+++ b/src/lib/efreet/efreet_desktop.c
@@ -777,7 +777,22 @@ efreet_desktop_application_fields_parse(Efreet_Desktop *desktop, Efreet_Ini *ini
if (val) desktop->path = strdup(val);
val = efreet_ini_string_get(ini, "StartupWMClass");
- if (val) desktop->startup_wm_class = strdup(val);
+ if ((val) && (val[0]) && (val[1]))
+ {
+ size_t len = strlen(val);
+ if (((val[0] == '"') && (val[len - 1] == '"') ) ||
+ ((val[0] == '\'') && (val[len - 1] == '\'')))
+ {
+ // fixup for some spec-violating apps that put startupwmclass
+ // in quotes... spec doesnt allow for this. just escapes.
+ char *tmpval = alloca(len - 1);
+ strncpy(tmpval, val + 1, len - 2);
+ tmpval[len - 2] = '\0';
+ desktop->startup_wm_class = strdup(tmpval);
+ }
+ else
+ desktop->startup_wm_class = strdup(val);
+ }
val = efreet_ini_string_get(ini, "Categories");
if (val)
diff --git a/src/lib/efreet/efreet_icon.c b/src/lib/efreet/efreet_icon.c
index 7078343e57..a07d2b216f 100644
--- a/src/lib/efreet/efreet_icon.c
+++ b/src/lib/efreet/efreet_icon.c
@@ -790,6 +790,8 @@ efreet_icon_fallback_lookup_path(Efreet_Cache_Fallback_Icon *icon)
}
#endif
+ path = efreet_icon_fallback_lookup_path_path(icon, "/usr/local/share/pixmaps");
+ if (path) return path;
path = efreet_icon_fallback_lookup_path_path(icon, "/usr/share/pixmaps");
if (path) return path;
diff --git a/src/lib/efreet/efreet_menu.c b/src/lib/efreet/efreet_menu.c
index 06c2c418fb..890934fc22 100644
--- a/src/lib/efreet/efreet_menu.c
+++ b/src/lib/efreet/efreet_menu.c
@@ -65,7 +65,7 @@ struct Efreet_Menu_Internal
Eina_List *layout; /**< This menus layout */
Eina_List *default_layout; /**< Default layout */
signed char show_empty; /**< Whether to show empty menus */
- signed char in_line; /**< Whether this meny can be inlined */
+ signed char in_line; /**< Whether this menu can be inlined */
signed char inline_limit; /**< Number of elements which triggers inline */
signed char inline_header; /**< Whether we should use the header name when this menu is inlined */
signed char inline_alias; /**< Whether we should use the menu name when inlining */
@@ -143,7 +143,7 @@ struct Efreet_Menu_Layout
/* The items below are for Menuname Layout elements */
signed char show_empty; /**< Whether to show empty menus */
- signed char in_line; /**< Whether this meny can be inlined */
+ signed char in_line; /**< Whether this menu can be inlined */
signed char inline_limit; /**< Number of elements which triggers inline */
signed char inline_header; /**< Whether we should use the header name when this menu is inlined */
signed char inline_alias; /**< Whether we should use the menu name when inlining */
@@ -531,7 +531,7 @@ efreet_menu_file_set(const char *file)
EFREET_DEPRECATED_API EAPI void
efreet_menu_async_get(Efreet_Menu_Cb func EINA_UNUSED, const void *data EINA_UNUSED)
{
- ERR("%s is deprecated and shouldn't be called", __FUNCTION__);
+ ERR("%s is deprecated and shouldn't be called", __func__);
return;
}
@@ -575,7 +575,7 @@ efreet_menu_get(void)
EFREET_DEPRECATED_API EAPI void
efreet_menu_async_parse(const char *path EINA_UNUSED, Efreet_Menu_Cb func EINA_UNUSED, const void *data EINA_UNUSED)
{
- ERR("%s is deprecated and shouldn't be called", __FUNCTION__);
+ ERR("%s is deprecated and shouldn't be called", __func__);
return;
}
diff --git a/src/lib/efreet/efreet_mime.c b/src/lib/efreet/efreet_mime.c
index 9eba8c8db9..d94894ff71 100644
--- a/src/lib/efreet/efreet_mime.c
+++ b/src/lib/efreet/efreet_mime.c
@@ -348,21 +348,12 @@ _efreet_mimedb_glob_mime_get(unsigned int num)
/** --------------------------------- **/
-EAPI int
-efreet_mime_init(void)
+int
+efreet_internal_mime_init(void)
{
if (++_efreet_mime_init_count != 1)
return _efreet_mime_init_count;
- if (!ecore_init())
- return --_efreet_mime_init_count;
-
- if (!ecore_file_init())
- goto shutdown_ecore;
-
- if (!efreet_init())
- goto shutdown_ecore_file;
-
_efreet_mime_log_dom = eina_log_domain_register
("efreet_mime", EFREET_DEFAULT_LOG_COLOR);
@@ -388,17 +379,11 @@ unregister_log_domain:
eina_log_domain_unregister(_efreet_mime_log_dom);
_efreet_mime_log_dom = -1;
shutdown_efreet:
- efreet_shutdown();
-shutdown_ecore_file:
- ecore_file_shutdown();
-shutdown_ecore:
- ecore_shutdown();
-
return --_efreet_mime_init_count;
-}
+ }
-EAPI int
-efreet_mime_shutdown(void)
+int
+efreet_internal_mime_shutdown(void)
{
if (_efreet_mime_init_count == 0)
{
@@ -428,13 +413,22 @@ efreet_mime_shutdown(void)
IF_FREE_HASH(mime_icons);
eina_log_domain_unregister(_efreet_mime_log_dom);
_efreet_mime_log_dom = -1;
- efreet_shutdown();
- ecore_file_shutdown();
- ecore_shutdown();
return _efreet_mime_init_count;
}
+EAPI int
+efreet_mime_init(void)
+{
+ return efreet_init();
+}
+
+EAPI int
+efreet_mime_shutdown(void)
+{
+ return efreet_shutdown();
+}
+
EAPI const char *
efreet_mime_type_get(const char *file)
{
diff --git a/src/lib/efreet/efreet_private.h b/src/lib/efreet/efreet_private.h
index eb42c28f74..77a74dfca1 100644
--- a/src/lib/efreet/efreet_private.h
+++ b/src/lib/efreet/efreet_private.h
@@ -114,7 +114,7 @@
/**
* macros that are used all around the code for message processing
- * four macros are defined ERR, WRN, DGB, INF.
+ * four macros are defined ERR, WRN, DGB, INF.
* EFREET_MODULE_LOG_DOM should be defined individually for each module
*/
#ifdef CRI
@@ -214,6 +214,12 @@ void efreet_desktop_shutdown(void);
int efreet_util_init(void);
int efreet_util_shutdown(void);
+int efreet_internal_mime_init(void);
+int efreet_internal_mime_shutdown(void);
+
+int efreet_internal_trash_init(void);
+int efreet_internal_trash_shutdown(void);
+
const char *efreet_home_dir_get(void);
void efreet_dirs_reset(void);
diff --git a/src/lib/efreet/efreet_trash.c b/src/lib/efreet/efreet_trash.c
index 04a4a6cda4..f3837caf47 100644
--- a/src/lib/efreet/efreet_trash.c
+++ b/src/lib/efreet/efreet_trash.c
@@ -32,28 +32,25 @@ static const char *efreet_trash_dir = NULL;
# define getuid() GetCurrentProcessId()
#endif
-EAPI int
-efreet_trash_init(void)
+
+int
+efreet_internal_trash_init(void)
{
if (++_efreet_trash_init_count != 1)
return _efreet_trash_init_count;
- if (!eina_init())
- return --_efreet_trash_init_count;
-
_efreet_trash_log_dom = eina_log_domain_register
("efreet_trash", EFREET_DEFAULT_LOG_COLOR);
if (_efreet_trash_log_dom < 0)
{
EINA_LOG_ERR("Efreet: Could not create a log domain for efreet_trash");
- eina_shutdown();
return --_efreet_trash_init_count;
}
return _efreet_trash_init_count;
}
-EAPI int
-efreet_trash_shutdown(void)
+int
+efreet_internal_trash_shutdown(void)
{
if (--_efreet_trash_init_count != 0)
return _efreet_trash_init_count;
@@ -61,11 +58,22 @@ efreet_trash_shutdown(void)
IF_RELEASE(efreet_trash_dir);
eina_log_domain_unregister(_efreet_trash_log_dom);
_efreet_trash_log_dom = -1;
- eina_shutdown();
return _efreet_trash_init_count;
}
+EAPI int
+efreet_trash_init(void)
+{
+ return efreet_init();
+}
+
+EAPI int
+efreet_trash_shutdown(void)
+{
+ return efreet_shutdown();
+}
+
EAPI const char*
efreet_trash_dir_get(const char *file)
{
diff --git a/src/lib/efreet/efreet_uri.c b/src/lib/efreet/efreet_uri.c
index 44fe54a35f..2b64556159 100644
--- a/src/lib/efreet/efreet_uri.c
+++ b/src/lib/efreet/efreet_uri.c
@@ -2,8 +2,15 @@
# include <config.h>
#endif
+#include <stdlib.h>
+#include <string.h>
#include <ctype.h>
+#ifdef _WIN32
+# include <windows.h>
+# include <shlwapi.h>
+#endif
+
#ifndef _POSIX_HOST_NAME_MAX
#define _POSIX_HOST_NAME_MAX 255
#endif
@@ -28,6 +35,64 @@ efreet_uri_decode(const char *full_uri)
EINA_SAFETY_ON_NULL_RETURN_VAL(full_uri, NULL);
/* An uri should be in the form <scheme>:[<authority>][<path>][<query>][<fragment>] */
+
+ /*
+ * Specific code for Windows when the scheme part of full_uri is 'file',
+ * for local Windows file path.
+ * see https://docs.microsoft.com/en-us/archive/blogs/ie/file-uris-in-windows
+ *
+ * Correct syntax :
+ * file:///c:/path/to/file
+ *
+ * The returned path must be c:\path\to\file
+ */
+#ifdef _WIN32
+
+ *scheme = 0;
+ *authority = 0;
+ *path = 0;
+
+ if (strncasecmp(full_uri, "file://", strlen("file://")) == 0)
+ {
+ HRESULT res;
+ DWORD len;
+# ifdef UNICODE
+ wchar_t buf[MAX_PATH];
+ wchar_t *w_full_uri;
+ char *uri;
+
+ w_full_uri = evil_utf8_to_utf16(full_uri);
+ if (!w_full_uri)
+ return NULL;
+
+ if (wcslen(w_full_uri) > 2048)
+ {
+ free(w_full_uri);
+ return NULL;
+ }
+
+ len = sizeof(buf);
+ res = PathCreateFromUrl(w_full_uri, buf, &len, 0UL);
+ free(w_full_uri);
+ if (res != S_OK)
+ return NULL;
+ uri = evil_utf16_to_utf8(buf);
+ if (uri)
+ {
+ strncpy(path, uri, sizeof(path));
+ path[sizeof(path)-1] = 0;
+ goto win32_file_scheme;
+ }
+#else
+ len = sizeof(path);
+ res = PathCreateFromUrl(full_uri, path, &len, 0UL);
+ if (res == S_OK)
+ goto win32_file_scheme;
+#endif
+ return NULL;
+ }
+#endif
+
sep = strchr(full_uri, ':');
if (!sep) return NULL;
/* check if we have a Windows PATH, that is a letter follow by a colon */
@@ -77,6 +142,11 @@ efreet_uri_decode(const char *full_uri)
path[i] = *p;
}
+#ifdef _WIN32
+ win32_file_scheme:
+ strcpy(scheme, "file");
+#endif
+
uri = NEW(Efreet_Uri, 1);
if (!uri) return NULL;
diff --git a/src/lib/efreet/efreet_uri.h b/src/lib/efreet/efreet_uri.h
index 32b1f51ad2..79bc2f3c1c 100644
--- a/src/lib/efreet/efreet_uri.h
+++ b/src/lib/efreet/efreet_uri.h
@@ -17,7 +17,7 @@ typedef struct Efreet_Uri Efreet_Uri;
/**
* Efreet_Uri
- * @brief Contains a simple rappresentation of an uri. The string don't have
+ * @brief Contains a simple rappresentation of an uri. The string don't have
* special chars escaped.
*/
struct Efreet_Uri
diff --git a/src/lib/efreet/meson.build b/src/lib/efreet/meson.build
index ea4ef9a6c0..1d02f3db1f 100644
--- a/src/lib/efreet/meson.build
+++ b/src/lib/efreet/meson.build
@@ -11,7 +11,7 @@ efreet_header_src = [
'Efreet_Trash.h'
]
-efreet_src = [
+efreet_src = files([
'efreet.c',
'efreet_base.c',
'efreet_icon.c',
@@ -25,18 +25,28 @@ efreet_src = [
'efreet_cache.c',
'efreet_private.h',
'efreet_xml.h',
- 'efreet_cache_private.h'
-]
+ 'efreet_cache_private.h',
+ 'efreet_mime.c',
+ 'efreet_trash.c'
+])
-efreet_deps = [eet, ecore, ecore_con, ecore_file, eo, efl, eina, emile, ecore_ipc, buildsystem,intl]
+efreet_deps = [eet, ecore, ecore_con, ecore_file, eo, efl, eina, emile, ecore_ipc, buildsystem]
efreet_pub_deps = [eina, eo, efl]
+efreet_ext_deps = [buildsystem_simple, intl, m]
+
+package_c_args += ['-DDATA_DIR="'+dir_data+'"']
+
+if sys_windows
+ shlwapi = cc.find_library('shlwapi')
+ efreet_ext_deps += [shlwapi]
+endif
efreet_lib = library('efreet',
efreet_src,
- dependencies: efreet_pub_deps + [m] + efreet_deps,
+ dependencies: efreet_pub_deps + efreet_ext_deps + efreet_deps,
include_directories : config_dir + [include_directories('.')],
install: true,
- c_args : [package_c_args, '-DDATA_DIR="'+dir_data+'"'],
+ c_args : package_c_args,
version : meson.project_version()
)
@@ -46,51 +56,40 @@ efreet = declare_dependency(
dependencies: efreet_pub_deps,
)
-efreet_mime_lib = library('efreet_mime',
- 'efreet_mime.c',
- dependencies: efreet_pub_deps + [m, efreet, efreet_deps],
- include_directories : config_dir + [include_directories('.')],
- install: true,
- c_args : package_c_args,
- version : meson.project_version()
+install_headers(efreet_header_src,
+ install_dir : dir_package_include,
)
-efreet_mime = declare_dependency(
- include_directories: [include_directories('.')],
- link_with: efreet_mime_lib,
- dependencies: efreet_pub_deps
-)
+#Deprecated efreet libs
+# everything and everyone should use efreet itself, efreet_mime and efreet_trash are contained in libefreet.so
+# libefreet_mime.so and libefreet_trash.so will just have NEEDED on libefreet.so so the symbols get caught in like that
-efreet_trash_lib = library('efreet_trash',
- 'efreet_trash.c',
- dependencies: efreet_pub_deps + [efreet, efreet_deps],
+deprecated_efreet_mime_lib = library('efreet_mime',
+ dependencies: [efreet],
include_directories : config_dir + [include_directories('.')],
install: true,
- c_args : package_c_args,
version : meson.project_version()
)
-efreet_trash = declare_dependency(
- include_directories: [include_directories('.')],
- link_with: efreet_trash_lib,
- dependencies: efreet_pub_deps,
-)
-
-install_headers(efreet_header_src,
- install_dir : dir_package_include,
+deprecated_efreet_trash_lib = library('efreet_trash',
+ dependencies: efreet,
+ include_directories : config_dir + [include_directories('.')],
+ install: true,
+ version : meson.project_version()
)
-
-pkgconfig.generate(efreet_mime_lib,
+pkgconfig.generate(efreet_lib,
name : 'efreet-mime',
+ description : 'Deprecated, please just use efreet',
subdirs : package_version_name,
version : version_major + '.' + version_minor + '.' + version_micro,
- libraries : [tmp_deps] + tmp_pub_deps,
+ libraries : efreet_pub_deps,
)
-pkgconfig.generate(efreet_trash_lib,
+pkgconfig.generate(efreet_lib,
name : 'efreet-trash',
+ description : 'Deprecated, please just use efreet',
subdirs : package_version_name,
version : version_major + '.' + version_minor + '.' + version_micro,
- libraries : [tmp_deps] + tmp_pub_deps,
+ libraries : efreet_pub_deps,
)