winrt: use windowsio in non-libc mode

CMake's SDL_build_config.h force disables HAVE_STDIO_H when buiding
winrt in non-libc mode.

Becase CreateFileEx is not available in UWP mode, use CreateFile2
instead.
main
Anonymous Maarten 2023-08-10 17:37:13 +02:00 committed by Anonymous Maarten
parent ea8757a748
commit b7889a7389
2 changed files with 25 additions and 11 deletions

View File

@ -107,7 +107,7 @@ typedef struct SDL_RWops
void *asset; void *asset;
} androidio; } androidio;
#elif defined(__WIN32__) || defined(__GDK__) #elif defined(__WIN32__) || defined(__GDK__) || defined(__WINRT__)
struct struct
{ {
SDL_bool append; SDL_bool append;

View File

@ -20,7 +20,7 @@
*/ */
#include "SDL_internal.h" #include "SDL_internal.h"
#if defined(__WIN32__) || defined(__GDK__) #if defined(__WIN32__) || defined(__GDK__) || defined(__WINRT__)
#include "../core/windows/SDL_windows.h" #include "../core/windows/SDL_windows.h"
#endif #endif
@ -47,10 +47,9 @@
#include "../core/android/SDL_android.h" #include "../core/android/SDL_android.h"
#endif #endif
#if defined(__WIN32__) || defined(__GDK__) #if defined(__WIN32__) || defined(__GDK__) || defined(__WINRT__)
/* Functions to read/write Win32 API file pointers */ /* Functions to read/write Win32 API file pointers */
#ifndef INVALID_SET_FILE_POINTER #ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF #define INVALID_SET_FILE_POINTER 0xFFFFFFFF
#endif #endif
@ -59,7 +58,7 @@
static int SDLCALL windows_file_open(SDL_RWops *context, const char *filename, const char *mode) static int SDLCALL windows_file_open(SDL_RWops *context, const char *filename, const char *mode)
{ {
#if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) #if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) && !defined(__WINRT__)
UINT old_error_mode; UINT old_error_mode;
#endif #endif
HANDLE h; HANDLE h;
@ -95,7 +94,7 @@ static int SDLCALL windows_file_open(SDL_RWops *context, const char *filename, c
if (!context->hidden.windowsio.buffer.data) { if (!context->hidden.windowsio.buffer.data) {
return SDL_OutOfMemory(); return SDL_OutOfMemory();
} }
#if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) #if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) && !defined(__WINRT__)
/* Do not open a dialog box if failure */ /* Do not open a dialog box if failure */
old_error_mode = old_error_mode =
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS); SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
@ -103,14 +102,29 @@ static int SDLCALL windows_file_open(SDL_RWops *context, const char *filename, c
{ {
LPTSTR tstr = WIN_UTF8ToString(filename); LPTSTR tstr = WIN_UTF8ToString(filename);
h = CreateFile(tstr, (w_right | r_right), #if defined(__WINRT__)
(w_right) ? 0 : FILE_SHARE_READ, NULL, CREATEFILE2_EXTENDED_PARAMETERS extparams;
SDL_zero(extparams);
extparams.dwSize = sizeof(extparams);
extparams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
h = CreateFile2(tstr,
(w_right | r_right),
(w_right) ? 0 : FILE_SHARE_READ,
(must_exist | truncate | a_mode),
&extparams);
#else
h = CreateFile(tstr,
(w_right | r_right),
(w_right) ? 0 : FILE_SHARE_READ,
NULL,
(must_exist | truncate | a_mode), (must_exist | truncate | a_mode),
FILE_ATTRIBUTE_NORMAL, NULL); FILE_ATTRIBUTE_NORMAL,
NULL);
#endif
SDL_free(tstr); SDL_free(tstr);
} }
#if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) #if !defined(__XBOXONE__) && !defined(__XBOXSERIES__) && !defined(__WINRT__)
/* restore old behavior */ /* restore old behavior */
SetErrorMode(old_error_mode); SetErrorMode(old_error_mode);
#endif #endif
@ -496,7 +510,7 @@ SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
rwops->close = Android_JNI_FileClose; rwops->close = Android_JNI_FileClose;
rwops->type = SDL_RWOPS_JNIFILE; rwops->type = SDL_RWOPS_JNIFILE;
#elif defined(__WIN32__) || defined(__GDK__) #elif defined(__WIN32__) || defined(__GDK__) || defined(__WINRT__)
rwops = SDL_CreateRW(); rwops = SDL_CreateRW();
if (rwops == NULL) { if (rwops == NULL) {
return NULL; /* SDL_SetError already setup by SDL_CreateRW() */ return NULL; /* SDL_SetError already setup by SDL_CreateRW() */