aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoff Evans <geoff@flummoxed.org>2021-06-08 12:00:29 -0700
committerGeoff Evans <geoff@flummoxed.org>2021-06-08 12:00:29 -0700
commit5d8abfd0ba60aff006e75f1d9881e3b1df05360a (patch)
tree54b16989b1c49c4f5e8c0d98f173dffcc736d0e0
parentfae861c75adbc598393245f34ad8871a9aaecd44 (diff)
downloadPROJ-5d8abfd0ba60aff006e75f1d9881e3b1df05360a.tar.gz
PROJ-5d8abfd0ba60aff006e75f1d9881e3b1df05360a.zip
Make filemanager aware of UWP Win32 API
-rw-r--r--src/filemanager.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/filemanager.cpp b/src/filemanager.cpp
index aa1db6e5..c0f58ca4 100644
--- a/src/filemanager.cpp
+++ b/src/filemanager.cpp
@@ -48,6 +48,12 @@
#include "proj_config.h"
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
+#define UWP 1
+#else
+#define UWP 0
+#endif
+
#ifdef _WIN32
#include <shlobj.h>
#include <windows.h>
@@ -692,10 +698,21 @@ std::unique_ptr<File> FileWin32::open(PJ_CONTEXT *ctx, const char *filename,
? FILE_ATTRIBUTE_READONLY
: FILE_ATTRIBUTE_NORMAL;
try {
+#if UWP
+ CREATEFILE2_EXTENDED_PARAMETERS extendedParameters;
+ ZeroMemory(&extendedParameters, sizeof(extendedParameters));
+ extendedParameters.dwSize = sizeof(extendedParameters);
+ extendedParameters.dwFileAttributes = dwFlagsAndAttributes;
+ HANDLE hFile = CreateFile2(
+ UTF8ToWString(std::string(filename)).c_str(), dwDesiredAccess,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+ dwCreationDisposition, &extendedParameters);
+#else // UWP
HANDLE hFile = CreateFileW(
UTF8ToWString(std::string(filename)).c_str(), dwDesiredAccess,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr,
dwCreationDisposition, dwFlagsAndAttributes, nullptr);
+#endif // UWP
return std::unique_ptr<File>(hFile != INVALID_HANDLE_VALUE
? new FileWin32(filename, ctx, hFile)
: nullptr);
@@ -1136,6 +1153,9 @@ const char *proj_context_get_user_writable_directory(PJ_CONTEXT *ctx,
wPath.resize(wcslen(wPath.data()));
path = NS_PROJ::WStringToUTF8(wPath);
#else
+#if UWP
+ if (false) {
+#else // UWP
wchar_t *wPath;
if (SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr, &wPath) ==
S_OK) {
@@ -1143,6 +1163,7 @@ const char *proj_context_get_user_writable_directory(PJ_CONTEXT *ctx,
std::string str = NS_PROJ::WStringToUTF8(ws);
path = str;
CoTaskMemFree(wPath);
+#endif // UWP
#endif
} else {
const char *local_app_data = getenv("LOCALAPPDATA");
@@ -1236,11 +1257,13 @@ static std::string pj_get_relative_share_proj_internal_no_check() {
#if defined(_WIN32) || defined(HAVE_LIBDL)
#ifdef _WIN32
HMODULE hm = NULL;
+#if !UWP
if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
(LPCSTR)&pj_get_relative_share_proj, &hm) == 0) {
return std::string();
}
+#endif // UWP
DWORD path_size = 1024;