9 changed files with 179 additions and 10 deletions
@ -0,0 +1,138 @@ |
|||||||
|
/* |
||||||
|
Simple DirectMedia Layer |
||||||
|
Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org> |
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied |
||||||
|
warranty. In no event will the authors be held liable for any damages |
||||||
|
arising from the use of this software. |
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose, |
||||||
|
including commercial applications, and to alter it and redistribute it |
||||||
|
freely, subject to the following restrictions: |
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not |
||||||
|
claim that you wrote the original software. If you use this software |
||||||
|
in a product, an acknowledgment in the product documentation would be |
||||||
|
appreciated but is not required. |
||||||
|
2. Altered source versions must be plainly marked as such, and must not be |
||||||
|
misrepresented as being the original software. |
||||||
|
3. This notice may not be removed or altered from any source distribution. |
||||||
|
|
||||||
|
An altered version based on: |
||||||
|
https://github.com/libsdl-org/SDL/blob/3c142abcb2b0b0ad7e08b096ea8d9a1a1e1af1ef/src/filesystem/cocoa/SDL_sysfilesystem.m |
||||||
|
|
||||||
|
Modifications: |
||||||
|
1. Changes to compile with gcc (@autoreleasepool -> NSAutoreleasePool) |
||||||
|
2. Targets SDL-1.2 rather than SDL2 (SDL_InvalidParamError -> SDL_SetError) |
||||||
|
*/ |
||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
||||||
|
/* System dependent filesystem routines */ |
||||||
|
|
||||||
|
#include <Foundation/Foundation.h> |
||||||
|
#include <sys/stat.h> |
||||||
|
#include <sys/types.h> |
||||||
|
|
||||||
|
#include <SDL.h> |
||||||
|
|
||||||
|
char *SDL_GetBasePath(void) |
||||||
|
{ |
||||||
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
||||||
|
NSBundle *bundle = [NSBundle mainBundle]; |
||||||
|
const char *baseType = [[[bundle infoDictionary] objectForKey:@"SDL_FILESYSTEM_BASE_DIR_TYPE"] UTF8String]; |
||||||
|
const char *base = NULL; |
||||||
|
char *retval = NULL; |
||||||
|
|
||||||
|
if (baseType == NULL) { |
||||||
|
baseType = "resource"; |
||||||
|
} |
||||||
|
if (SDL_strcasecmp(baseType, "bundle") == 0) { |
||||||
|
base = [[bundle bundlePath] fileSystemRepresentation]; |
||||||
|
} else if (SDL_strcasecmp(baseType, "parent") == 0) { |
||||||
|
base = [[[bundle bundlePath] stringByDeletingLastPathComponent] fileSystemRepresentation]; |
||||||
|
} else { |
||||||
|
/* this returns the exedir for non-bundled and the resourceDir for bundled apps */ |
||||||
|
base = [[bundle resourcePath] fileSystemRepresentation]; |
||||||
|
} |
||||||
|
|
||||||
|
if (base) { |
||||||
|
const size_t len = SDL_strlen(base) + 2; |
||||||
|
retval = (char *)SDL_malloc(len); |
||||||
|
if (retval == NULL) { |
||||||
|
SDL_OutOfMemory(); |
||||||
|
} else { |
||||||
|
SDL_snprintf(retval, len, "%s/", base); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[pool drain]; |
||||||
|
return retval; |
||||||
|
} |
||||||
|
|
||||||
|
char *SDL_GetPrefPath(const char *org, const char *app) |
||||||
|
{ |
||||||
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
||||||
|
char *retval = NULL; |
||||||
|
NSArray *array; |
||||||
|
|
||||||
|
if (!app) { |
||||||
|
SDL_SetError("SDL_GetPrefPath: app argument cannot be null"); |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
if (!org) { |
||||||
|
org = ""; |
||||||
|
} |
||||||
|
|
||||||
|
#if !TARGET_OS_TV |
||||||
|
array = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); |
||||||
|
#else |
||||||
|
/* tvOS does not have persistent local storage! |
||||||
|
* The only place on-device where we can store data is |
||||||
|
* a cache directory that the OS can empty at any time. |
||||||
|
* |
||||||
|
* It's therefore very likely that save data will be erased |
||||||
|
* between sessions. If you want your app's save data to |
||||||
|
* actually stick around, you'll need to use iCloud storage. |
||||||
|
*/ |
||||||
|
{ |
||||||
|
static SDL_bool shown = SDL_FALSE; |
||||||
|
if (!shown) { |
||||||
|
shown = SDL_TRUE; |
||||||
|
SDL_LogCritical(SDL_LOG_CATEGORY_SYSTEM, "tvOS does not have persistent local storage! Use iCloud storage if you want your data to persist between sessions.\n"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
array = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); |
||||||
|
#endif /* !TARGET_OS_TV */ |
||||||
|
|
||||||
|
if ([array count] > 0) { /* we only want the first item in the list. */ |
||||||
|
NSString *str = [array objectAtIndex:0]; |
||||||
|
const char *base = [str fileSystemRepresentation]; |
||||||
|
if (base) { |
||||||
|
const size_t len = SDL_strlen(base) + SDL_strlen(org) + SDL_strlen(app) + 4; |
||||||
|
retval = (char *)SDL_malloc(len); |
||||||
|
if (retval == NULL) { |
||||||
|
SDL_OutOfMemory(); |
||||||
|
} else { |
||||||
|
char *ptr; |
||||||
|
if (*org) { |
||||||
|
SDL_snprintf(retval, len, "%s/%s/%s/", base, org, app); |
||||||
|
} else { |
||||||
|
SDL_snprintf(retval, len, "%s/%s/", base, app); |
||||||
|
} |
||||||
|
for (ptr = retval + 1; *ptr; ptr++) { |
||||||
|
if (*ptr == '/') { |
||||||
|
*ptr = '\0'; |
||||||
|
mkdir(retval, 0700); |
||||||
|
*ptr = '/'; |
||||||
|
} |
||||||
|
} |
||||||
|
mkdir(retval, 0700); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
[pool drain]; |
||||||
|
return retval; |
||||||
|
} |
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */ |
||||||
Loading…
Reference in new issue