include/SDL_platform.h
author David Ludwig <dludwig@pobox.com>
Sat, 29 Nov 2014 10:09:30 -0500
changeset 9247 eddb899239fe
parent 8979 1e283b7a1580
child 9619 b94b6d0bff0f
permissions -rw-r--r--
WinRT: bug and data-integrity fixes for SDL_GetPrefPath()

This change does a few things, all with regards to the WinRT implementation of
SDL_GetPrefPath():

1. it fixes a bug whereby SDL_GetPrefPath() did not create the directory it
returned. On other SDL platforms, SDL_GetPrefPath() will create separate
directories for its 'org' and 'app' folders. Without this, attempts to create
files in the pref-path would fail, unless those directories were first created
by the app, or by some other library the app used. This change makes sure
that these directories get created, before SDL_GetPrefPath() returns to its
caller(s).


2. it defaults to having SDL_GetPrefPath() return a WinRT 'Local' folder
on all platforms. Previously, for Windows Store apps, it would have used a
different, 'Roaming' folder. Files in Roaming folders can be automatically,
and synchronized across multiple devices by Windows. This synchronization can
happen while the app runs, with new files being copied into a running app's
pref-path. Unless an app is specifically designed to handle this scenario,
there is a chance that save-data could be overwritten in unwanted or
unexpected ways.

The default is now to use a Local folder, which does not get synchronized, and
which is arguably a bit safer to use. Apps that wish to use Roaming folders
can do so by setting SDL_HINT_WINRT_PREF_PATH_ROOT to "roaming", however it
is recommended that one first read Microsoft's documentation for Roaming
files, a link to which is provided in README-winrt.md.

To preserve older pref-path selection behavior (found in SDL 2.0.3, as well as
many pre-2.0.4 versions of SDL from hg.libsdl.org), which uses a Roaming path
in Windows Store apps, and a Local path in Windows Phone, set
SDL_HINT_WINRT_PREF_PATH_ROOT to "old".

Please note that Roaming paths are not supported on Windows Phone 8.0, due to
limitations in the OS itself. Attempts to use this will fail.
(Windows Phone 8.1 does not have this limitation, however.)


3. It makes SDL_GetPrefPath(), when on Windows Phone 8.0, and when
SDL_HINT_WINRT_PREF_PATH_ROOT is set to "roaming", return NULL, rather than
silently defaulting to a Local path (then switching to a Roaming path if and
when the user upgraded to Windows Phone 8.1).
slouken@8582
     1
/*
slouken@8582
     2
  Simple DirectMedia Layer
slouken@8149
     3
  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
slouken@8582
     4
slouken@8582
     5
  This software is provided 'as-is', without any express or implied
slouken@8582
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@8582
     7
  arising from the use of this software.
slouken@8582
     8
slouken@8582
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@8582
    10
  including commercial applications, and to alter it and redistribute it
slouken@8582
    11
  freely, subject to the following restrictions:
slouken@8582
    12
slouken@8582
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@8582
    14
     claim that you wrote the original software. If you use this software
slouken@8582
    15
     in a product, an acknowledgment in the product documentation would be
slouken@8582
    16
     appreciated but is not required.
slouken@8582
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@8582
    18
     misrepresented as being the original software.
slouken@8582
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@8582
    20
*/
slouken@8582
    21
slouken@8582
    22
/**
slouken@8582
    23
 *  \file SDL_platform.h
slouken@8582
    24
 *
slouken@8582
    25
 *  Try to get a standard set of platform defines.
slouken@8582
    26
 */
slouken@8582
    27
slouken@8582
    28
#ifndef _SDL_platform_h
slouken@8582
    29
#define _SDL_platform_h
slouken@8582
    30
slouken@8582
    31
#if defined(_AIX)
slouken@8582
    32
#undef __AIX__
slouken@8582
    33
#define __AIX__     1
slouken@8582
    34
#endif
slouken@8582
    35
#if defined(__HAIKU__)
slouken@8582
    36
#undef __HAIKU__
slouken@8582
    37
#define __HAIKU__   1
slouken@8582
    38
#endif
slouken@8582
    39
#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__)
slouken@8582
    40
#undef __BSDI__
slouken@8582
    41
#define __BSDI__    1
slouken@8582
    42
#endif
slouken@8582
    43
#if defined(_arch_dreamcast)
slouken@8582
    44
#undef __DREAMCAST__
slouken@8582
    45
#define __DREAMCAST__   1
slouken@8582
    46
#endif
slouken@8582
    47
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
slouken@8582
    48
#undef __FREEBSD__
slouken@8582
    49
#define __FREEBSD__ 1
slouken@8582
    50
#endif
slouken@8582
    51
#if defined(hpux) || defined(__hpux) || defined(__hpux__)
slouken@8582
    52
#undef __HPUX__
slouken@8582
    53
#define __HPUX__    1
slouken@8582
    54
#endif
slouken@8582
    55
#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE)
slouken@8582
    56
#undef __IRIX__
slouken@8582
    57
#define __IRIX__    1
slouken@8582
    58
#endif
gabomdq@8833
    59
#if (defined(linux) || defined(__linux) || defined(__linux__))
slouken@8582
    60
#undef __LINUX__
slouken@8582
    61
#define __LINUX__   1
slouken@8582
    62
#endif
philipp@8150
    63
#if defined(ANDROID) || defined(__ANDROID__)
slouken@8582
    64
#undef __ANDROID__
slouken@8582
    65
#undef __LINUX__ /* do we need to do this? */
slouken@8582
    66
#define __ANDROID__ 1
slouken@8582
    67
#endif
slouken@8582
    68
slouken@8582
    69
#if defined(__APPLE__)
slouken@8582
    70
/* lets us know what version of Mac OS X we're compiling on */
slouken@8582
    71
#include "AvailabilityMacros.h"
slouken@8582
    72
#include "TargetConditionals.h"
slouken@8582
    73
#if TARGET_OS_IPHONE
slouken@8582
    74
/* if compiling for iPhone */
slouken@8582
    75
#undef __IPHONEOS__
slouken@8582
    76
#define __IPHONEOS__ 1
slouken@8582
    77
#undef __MACOSX__
slouken@8582
    78
#else
slouken@8582
    79
/* if not compiling for iPhone */
slouken@8582
    80
#undef __MACOSX__
slouken@8582
    81
#define __MACOSX__  1
slouken@8582
    82
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1050
slouken@8582
    83
# error SDL for Mac OS X only supports deploying on 10.5 and above.
slouken@8582
    84
#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1050 */
slouken@8582
    85
#endif /* TARGET_OS_IPHONE */
slouken@8582
    86
#endif /* defined(__APPLE__) */
slouken@8582
    87
slouken@8582
    88
#if defined(__NetBSD__)
slouken@8582
    89
#undef __NETBSD__
slouken@8582
    90
#define __NETBSD__  1
slouken@8582
    91
#endif
slouken@8582
    92
#if defined(__OpenBSD__)
slouken@8582
    93
#undef __OPENBSD__
slouken@8582
    94
#define __OPENBSD__ 1
slouken@8582
    95
#endif
slouken@8582
    96
#if defined(__OS2__)
slouken@8582
    97
#undef __OS2__
slouken@8582
    98
#define __OS2__     1
slouken@8582
    99
#endif
slouken@8582
   100
#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE)
slouken@8582
   101
#undef __OSF__
slouken@8582
   102
#define __OSF__     1
slouken@8582
   103
#endif
slouken@8582
   104
#if defined(__QNXNTO__)
slouken@8582
   105
#undef __QNXNTO__
slouken@8582
   106
#define __QNXNTO__  1
slouken@8582
   107
#endif
slouken@8582
   108
#if defined(riscos) || defined(__riscos) || defined(__riscos__)
slouken@8582
   109
#undef __RISCOS__
slouken@8582
   110
#define __RISCOS__  1
slouken@8582
   111
#endif
binarycrusader@8979
   112
#if defined(__sun) && defined(__SVR4)
slouken@8582
   113
#undef __SOLARIS__
slouken@8582
   114
#define __SOLARIS__ 1
slouken@8582
   115
#endif
slouken@8582
   116
dludwig@8630
   117
#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
slouken@8582
   118
/* Try to find out if we're compiling for WinRT or non-WinRT */
slouken@8614
   119
/* If _USING_V110_SDK71_ is defined it means we are using the v110_xp or v120_xp toolset. */
dludwig@8630
   120
#if (defined(_MSC_VER) && (_MSC_VER >= 1700) && !_USING_V110_SDK71_)	/* _MSC_VER==1700 for MSVC 2012 */
slouken@8582
   121
#include <winapifamily.h>
slouken@8584
   122
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
slouken@8582
   123
#undef __WINDOWS__
slouken@8582
   124
#define __WINDOWS__   1
slouken@8582
   125
/* See if we're compiling for WinRT: */
slouken@8582
   126
#elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
slouken@8582
   127
#undef __WINRT__
slouken@8582
   128
#define __WINRT__ 1
slouken@8584
   129
#endif
slouken@8584
   130
#else
slouken@8584
   131
#undef __WINDOWS__
slouken@8584
   132
#define __WINDOWS__   1
slouken@8584
   133
#endif /* _MSC_VER < 1700 */
slouken@8582
   134
#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */
slouken@8582
   135
slouken@8582
   136
#if defined(__WINDOWS__)
slouken@8582
   137
#undef __WIN32__
slouken@8582
   138
#define __WIN32__ 1
slouken@8582
   139
#endif
slouken@8582
   140
#if defined(__PSP__)
slouken@8582
   141
#undef __PSP__
slouken@8582
   142
#define __PSP__ 1
slouken@8582
   143
#endif
slouken@8582
   144
gabomdq@8833
   145
/* The NACL compiler defines __native_client__ and __pnacl__
gabomdq@8833
   146
 * Ref: http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi
gabomdq@8833
   147
 */
gabomdq@8833
   148
#if defined(__native_client__)
gabomdq@8833
   149
#undef __LINUX__
gabomdq@8833
   150
#undef __NACL__
gabomdq@8833
   151
#define __NACL__ 1
gabomdq@8833
   152
#endif
gabomdq@8833
   153
#if defined(__pnacl__)
gabomdq@8833
   154
#undef __LINUX__
gabomdq@8833
   155
#undef __PNACL__
gabomdq@8833
   156
#define __PNACL__ 1
gabomdq@8833
   157
/* PNACL with newlib supports static linking only */
gabomdq@8833
   158
#define __SDL_NOGETPROCADDR__
gabomdq@8833
   159
#endif
gabomdq@8833
   160
gabomdq@8833
   161
slouken@8582
   162
#include "begin_code.h"
slouken@8582
   163
/* Set up for C function definitions, even when using C++ */
slouken@8582
   164
#ifdef __cplusplus
slouken@8582
   165
extern "C" {
slouken@8582
   166
#endif
slouken@8582
   167
slouken@8582
   168
/**
slouken@8582
   169
 *  \brief Gets the name of the platform.
slouken@8582
   170
 */
slouken@8582
   171
extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void);
slouken@8582
   172
slouken@8582
   173
/* Ends C function definitions when using C++ */
slouken@8582
   174
#ifdef __cplusplus
slouken@8582
   175
}
slouken@8582
   176
#endif
slouken@8582
   177
#include "close_code.h"
slouken@8582
   178
slouken@8582
   179
#endif /* _SDL_platform_h */
slouken@8582
   180
slouken@8582
   181
/* vi: set ts=4 sw=4 expandtab: */