From ec4ef6911591b0ce47616438dfd34626d9302537 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Sat, 6 Feb 2021 14:49:54 +0000 Subject: Efreet: fix file:// scheme on Windows Summary: On Windows, file:///c:/path/to/file is correct and not managed. Use a Win API for manage it correctly Test Plan: test case Reviewers: raster, cedric Reviewed By: raster Subscribers: #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D12244 --- src/lib/efreet/efreet_uri.c | 70 +++++++++++++++++++++++++++++++++++++++++++++ src/lib/efreet/meson.build | 5 ++++ 2 files changed, 75 insertions(+) (limited to 'src/lib') 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 #endif +#include +#include #include +#ifdef _WIN32 +# include +# include +#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 :[][][][] */ + + /* + * 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/meson.build b/src/lib/efreet/meson.build index 41d3113566..1d02f3db1f 100644 --- a/src/lib/efreet/meson.build +++ b/src/lib/efreet/meson.build @@ -36,6 +36,11 @@ 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 + efreet_ext_deps + efreet_deps, -- cgit v1.2.1