diff options
Diffstat (limited to 'src/lib/efreet')
-rw-r--r-- | src/lib/efreet/Efreet.h | 9 | ||||
-rw-r--r-- | src/lib/efreet/Efreet_Trash.h | 2 | ||||
-rw-r--r-- | src/lib/efreet/efreet.c | 12 | ||||
-rw-r--r-- | src/lib/efreet/efreet_base.c | 80 | ||||
-rw-r--r-- | src/lib/efreet/efreet_cache.c | 202 | ||||
-rw-r--r-- | src/lib/efreet/efreet_cache_private.h | 28 | ||||
-rw-r--r-- | src/lib/efreet/efreet_desktop.c | 17 | ||||
-rw-r--r-- | src/lib/efreet/efreet_icon.c | 2 | ||||
-rw-r--r-- | src/lib/efreet/efreet_menu.c | 8 | ||||
-rw-r--r-- | src/lib/efreet/efreet_mime.c | 40 | ||||
-rw-r--r-- | src/lib/efreet/efreet_private.h | 8 | ||||
-rw-r--r-- | src/lib/efreet/efreet_trash.c | 26 | ||||
-rw-r--r-- | src/lib/efreet/efreet_uri.c | 70 | ||||
-rw-r--r-- | src/lib/efreet/efreet_uri.h | 2 | ||||
-rw-r--r-- | src/lib/efreet/meson.build | 69 |
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, ) |