2015-06-21 09:33:46 -06:00
/*
Simple DirectMedia Layer
2024-01-01 14:15:26 -07:00
Copyright ( C ) 1997 - 2024 Sam Lantinga < slouken @ libsdl . org >
2015-06-21 09:33:46 -06:00
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 .
*/
/**
* \ file SDL_filesystem . h
*
2023-11-06 08:26:06 -07:00
* Include file for filesystem SDL API functions
2015-06-21 09:33:46 -06:00
*/
2016-11-20 22:34:54 -07:00
# ifndef SDL_filesystem_h_
# define SDL_filesystem_h_
2015-06-21 09:33:46 -06:00
2022-11-26 21:43:38 -07:00
# include <SDL3/SDL_stdinc.h>
2015-06-21 09:33:46 -06:00
2022-12-22 09:38:59 -07:00
# include <SDL3/SDL_begin_code.h>
2015-06-21 09:33:46 -06:00
/* Set up for C function definitions, even when using C++ */
# ifdef __cplusplus
extern " C " {
# endif
/**
2021-03-21 12:18:39 -06:00
* Get the directory where the application was run from .
2015-06-21 09:33:46 -06:00
*
2021-03-21 12:18:39 -06:00
* This is not necessarily a fast call , so you should call this once near
* startup and save the string if you need it .
2015-06-21 09:33:46 -06:00
*
2022-11-25 17:01:17 -07:00
* * * macOS and iOS Specific Functionality * * : If the application is in a " .app "
* bundle , this function returns the Resource directory ( e . g .
2021-03-21 12:18:39 -06:00
* MyApp . app / Contents / Resources / ) . This behaviour can be overridden by adding
* a property to the Info . plist file . Adding a string key with the name
* SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the
* behaviour .
2015-06-21 09:33:46 -06:00
*
2021-03-21 12:18:39 -06:00
* Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property ( Given an
* application in / Applications / SDLApp / MyApp . app ) :
2015-06-21 09:33:46 -06:00
*
2021-03-21 12:18:39 -06:00
* - ` resource ` : bundle resource directory ( the default ) . For example :
2021-03-24 08:47:03 -06:00
* ` / Applications / SDLApp / MyApp . app / Contents / Resources `
2021-09-28 11:03:06 -06:00
* - ` bundle ` : the Bundle directory . For example :
2021-03-24 08:47:03 -06:00
* ` / Applications / SDLApp / MyApp . app / `
2021-03-21 12:18:39 -06:00
* - ` parent ` : the containing directory of the bundle . For example :
2021-03-24 08:47:03 -06:00
* ` / Applications / SDLApp / `
2021-03-21 12:18:39 -06:00
*
2022-11-14 15:34:22 -07:00
* * * Nintendo 3 DS Specific Functionality * * : This function returns " romfs "
2022-11-14 22:25:16 -07:00
* directory of the application as it is uncommon to store resources outside
* the executable . As such it is not a writable directory .
2022-11-14 15:34:22 -07:00
*
2023-12-27 13:21:11 -07:00
* The returned path is guaranteed to end with a path separator ( ' \\ ' on
2021-03-21 12:18:39 -06:00
* Windows , ' / ' on most other platforms ) .
*
2021-07-14 15:07:04 -06:00
* The pointer returned is owned by the caller . Please call SDL_free ( ) on the
* pointer when done with it .
2021-03-21 12:18:39 -06:00
*
* \ returns an absolute path in UTF - 8 encoding to the application data
* directory . NULL will be returned on error or when the platform
* doesn ' t implement this functionality , call SDL_GetError ( ) for more
* information .
*
2022-11-22 15:40:14 -07:00
* \ since This function is available since SDL 3.0 .0 .
2015-06-21 09:33:46 -06:00
*
* \ sa SDL_GetPrefPath
*/
extern DECLSPEC char * SDLCALL SDL_GetBasePath ( void ) ;
/**
2021-03-21 12:18:39 -06:00
* Get the user - and - app - specific path where files can be written .
2015-06-21 09:33:46 -06:00
*
* Get the " pref dir " . This is meant to be where users can write personal
2021-03-21 12:18:39 -06:00
* files ( preferences and save games , etc ) that are specific to your
* application . This directory is unique per user , per application .
2015-06-21 09:33:46 -06:00
*
2021-07-14 15:07:04 -06:00
* This function will decide the appropriate location in the native
* filesystem , create the directory if necessary , and return a string of the
* absolute path to the directory in UTF - 8 encoding .
2015-06-21 09:33:46 -06:00
*
* On Windows , the string might look like :
*
2021-03-21 12:18:39 -06:00
* ` C : \ \ Users \ \ bob \ \ AppData \ \ Roaming \ \ My Company \ \ My Program Name \ \ `
*
2022-07-11 09:44:49 -06:00
* On Linux , the string might look like :
2021-03-21 12:18:39 -06:00
*
* ` / home / bob / . local / share / My Program Name / `
2015-06-21 09:33:46 -06:00
*
2022-11-25 17:00:06 -07:00
* On macOS , the string might look like :
2021-03-21 12:18:39 -06:00
*
* ` / Users / bob / Library / Application Support / My Program Name / `
*
* You should assume the path returned by this function is the only safe place
* to write files ( and that SDL_GetBasePath ( ) , while it might be writable , or
* even the parent of the returned path , isn ' t where you should be writing
* things ) .
*
* Both the org and app strings may become part of a directory name , so please
* follow these rules :
*
* - Try to use the same org string ( _including case - sensitivity_ ) for all
2021-03-24 08:47:03 -06:00
* your applications that use this function .
2021-03-21 12:18:39 -06:00
* - Always use a unique app string for each one , and make sure it never
2021-03-24 08:47:03 -06:00
* changes for an app once you ' ve decided on it .
2021-03-21 12:18:39 -06:00
* - Unicode characters are legal , as long as it ' s UTF - 8 encoded , but . . .
* - . . . only use letters , numbers , and spaces . Avoid punctuation like " Game
2021-03-24 08:47:03 -06:00
* Name 2 : Bad Guy ' s Revenge ! " ... " Game Name 2 " is sufficient.
2021-03-21 12:18:39 -06:00
*
2023-12-27 13:21:11 -07:00
* The returned path is guaranteed to end with a path separator ( ' \\ ' on
2021-03-21 12:18:39 -06:00
* Windows , ' / ' on most other platforms ) .
*
2021-07-14 15:07:04 -06:00
* The pointer returned is owned by the caller . Please call SDL_free ( ) on the
* pointer when done with it .
2021-03-21 12:18:39 -06:00
*
* \ param org the name of your organization
* \ param app the name of your application
* \ returns a UTF - 8 string of the user directory in platform - dependent
* notation . NULL if there ' s a problem ( creating directory failed ,
* etc . ) .
*
2022-11-22 15:40:14 -07:00
* \ since This function is available since SDL 3.0 .0 .
2015-06-21 09:33:46 -06:00
*
* \ sa SDL_GetBasePath
*/
extern DECLSPEC char * SDLCALL SDL_GetPrefPath ( const char * org , const char * app ) ;
2023-05-04 12:38:11 -06:00
/**
* The type of the OS - provided default folder for a specific purpose .
*
* Note that the Trash folder isn ' t included here , because trashing files usually
* involves extra OS - specific functionality to remember the file ' s original
* location .
*
2023-05-05 10:38:35 -06:00
* The folders supported per platform are :
*
* | | Windows | macOS / iOS | tvOS | Unix ( XDG ) | Haiku | Emscripten |
* | - - - - - - - - - - - | - - - - - - - | - - - - - - - - - | - - - - | - - - - - - - - - - | - - - - - | - - - - - - - - - - |
* | HOME | X | X | | X | X | X |
* | DESKTOP | X | X | | X | X | |
* | DOCUMENTS | X | X | | X | | |
* | DOWNLOADS | Vista + | X | | X | | |
* | MUSIC | X | X | | X | | |
* | PICTURES | X | X | | X | | |
* | PUBLICSHARE | | X | | X | | |
* | SAVEDGAMES | Vista + | | | | | |
* | SCREENSHOTS | Vista + | | | | | |
* | TEMPLATES | X | X | | X | | |
2023-07-28 11:45:37 -06:00
* | VIDEOS | X | X * | | X | | |
2023-05-05 10:38:35 -06:00
*
2023-07-28 11:45:37 -06:00
* * Note that on macOS / iOS , the Videos folder is called " Movies " .
2023-05-05 10:38:35 -06:00
*
2023-07-28 11:45:37 -06:00
* \ sa SDL_GetUserFolder
2023-05-04 12:38:11 -06:00
*/
typedef enum
{
/** The folder which contains all of the current user's data, preferences,
and documents . It usually contains most of the other folders . If a
requested folder does not exist , the home folder can be considered a safe
2023-05-05 10:38:35 -06:00
fallback to store a user ' s documents . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_HOME ,
/** The folder of files that are displayed on the desktop. Note that the
existence of a desktop folder does not guarantee that the system does
show icons on its desktop ; certain GNU / Linux distros with a graphical
2023-05-05 10:38:35 -06:00
environment may not have desktop icons . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_DESKTOP ,
2023-05-05 10:38:35 -06:00
/** User document files, possibly application-specific. This is a good
place to save a user ' s projects . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_DOCUMENTS ,
2023-05-05 10:38:35 -06:00
/** Standard folder for user files downloaded from the internet. */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_DOWNLOADS ,
/** Music files that can be played using a standard music player (mp3,
2023-05-05 10:38:35 -06:00
ogg . . . ) . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_MUSIC ,
/** Image files that can be displayed using a standard viewer (png,
2023-05-05 10:38:35 -06:00
jpg . . . ) . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_PICTURES ,
/** Files that are meant to be shared with other users on the same
2023-05-05 10:38:35 -06:00
computer . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_PUBLICSHARE ,
2023-05-05 10:38:35 -06:00
/** Save files for games. */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_SAVEDGAMES ,
2023-05-05 10:38:35 -06:00
/** Application screenshots. */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_SCREENSHOTS ,
/** Template files to be used when the user requests the desktop environment
to create a new file in a certain folder , such as " New Text File.txt " .
Any file in the Templates folder can be used as a starting point for a
2023-05-05 10:38:35 -06:00
new file . */
2023-05-04 12:38:11 -06:00
SDL_FOLDER_TEMPLATES ,
/** Video files that can be played using a standard video player (mp4,
2023-05-05 10:38:35 -06:00
webm . . . ) . */
2023-06-27 22:52:33 -06:00
SDL_FOLDER_VIDEOS
2023-05-04 12:38:11 -06:00
} SDL_Folder ;
/**
2024-02-27 08:44:09 -07:00
* Finds the most suitable user folder for the specified purpose , and returns
* its path in OS - specific notation .
2023-05-04 12:38:11 -06:00
*
* Many OSes provide certain standard folders for certain purposes , such as
* storing pictures , music or videos for a certain user . This function gives
* the path for many of those special locations .
*
2023-07-28 11:45:37 -06:00
* This function is specifically for _user_ folders , which are meant for the
* user to access and manage . For application - specific folders , meant to hold
* data for the application to manage , see SDL_GetBasePath ( ) and
* SDL_GetPrefPath ( ) .
*
2023-05-04 12:38:11 -06:00
* Note that the function is expensive , and should be called once at the
* beginning of the execution and kept for as long as needed .
*
* The returned value is owned by the caller and should be freed with
* SDL_free ( ) .
*
* If NULL is returned , the error may be obtained with SDL_GetError ( ) .
*
2023-06-22 07:42:51 -06:00
* \ param folder The type of folder to find
2023-05-04 12:38:11 -06:00
* \ returns Either a null - terminated C string containing the full path to the
* folder , or NULL if an error happened .
*
2023-06-22 07:42:51 -06:00
* \ since This function is available since SDL 3.0 .0 .
2023-05-04 12:38:11 -06:00
*/
2023-07-28 11:45:37 -06:00
extern DECLSPEC char * SDLCALL SDL_GetUserFolder ( SDL_Folder folder ) ;
2023-05-04 12:38:11 -06:00
2024-03-16 09:15:13 -06:00
/* Abstract filesystem interface */
typedef enum SDL_PathType
{
2024-03-18 09:43:22 -06:00
SDL_PATHTYPE_NONE , /**< path does not exist */
SDL_PATHTYPE_FILE , /**< a normal file */
2024-03-16 09:15:13 -06:00
SDL_PATHTYPE_DIRECTORY , /**< a directory */
2024-03-18 09:43:22 -06:00
SDL_PATHTYPE_OTHER /**< something completely different like a device node (not a symlink, those are always followed) */
2024-03-16 09:15:13 -06:00
} SDL_PathType ;
2024-03-17 14:11:13 -06:00
/* SDL file times are 64-bit integers representing nanoseconds since the Unix epoch (Jan 1, 1970)
*
* They can be converted between to POSIX time_t values with SDL_NS_TO_SECONDS ( ) and SDL_SECONDS_TO_NS ( ) , and between Windows FILETIME values with SDL_FileTimeToWindows ( ) and SDL_FileTimeFromWindows ( )
*/
typedef Sint64 SDL_FileTime ;
2024-03-16 09:15:13 -06:00
typedef struct SDL_PathInfo
{
2024-03-17 14:11:13 -06:00
SDL_PathType type ; /* the path type */
Uint64 size ; /* the file size in bytes */
SDL_FileTime create_time ; /* the time when the path was created */
SDL_FileTime modify_time ; /* the last time the path was modified */
SDL_FileTime access_time ; /* the last time the path was read */
2024-03-16 09:15:13 -06:00
} SDL_PathInfo ;
/**
* Create a directory .
*
* \ param path the path of the directory to create
* \ returns 0 on success or a negative error code on failure ; call
* SDL_GetError ( ) for more information .
*
* \ since This function is available since SDL 3.0 .0 .
*/
extern DECLSPEC int SDLCALL SDL_CreateDirectory ( const char * path ) ;
2024-03-16 10:18:32 -06:00
/* Callback for directory enumeration. Return 1 to keep enumerating, 0 to stop enumerating (no error), -1 to stop enumerating and report an error. `dirname` is the directory being enumerated, `fname` is the enumerated entry. */
typedef int ( SDLCALL * SDL_EnumerateDirectoryCallback ) ( void * userdata , const char * dirname , const char * fname ) ;
2024-03-16 09:15:13 -06:00
/**
* Enumerate a directory .
*
* \ param path the path of the directory to enumerate
* \ param callback a function that is called for each entry in the directory
* \ param userdata a pointer that is passed to ` callback `
* \ returns 0 on success or a negative error code on failure ; call
* SDL_GetError ( ) for more information .
*
* \ since This function is available since SDL 3.0 .0 .
*/
extern DECLSPEC int SDLCALL SDL_EnumerateDirectory ( const char * path , SDL_EnumerateDirectoryCallback callback , void * userdata ) ;
/**
* Remove a file or an empty directory .
*
* \ param path the path of the directory to enumerate
* \ returns 0 on success or a negative error code on failure ; call
* SDL_GetError ( ) for more information .
*
* \ since This function is available since SDL 3.0 .0 .
*/
extern DECLSPEC int SDLCALL SDL_RemovePath ( const char * path ) ;
/**
* Rename a file or directory .
*
* \ param oldpath the old path
* \ param newpath the new path
* \ returns 0 on success or a negative error code on failure ; call
* SDL_GetError ( ) for more information .
*
* \ since This function is available since SDL 3.0 .0 .
*/
extern DECLSPEC int SDLCALL SDL_RenamePath ( const char * oldpath , const char * newpath ) ;
/**
* Get information about a filesystem path .
*
* \ param path the path to query
2024-03-18 09:57:23 -06:00
* \ param info a pointer filled in with information about the path , or NULL to
* check for the existence of a file
* \ returns 0 on success or a negative error code if the file doesn ' t exist ,
* or another failure ; call SDL_GetError ( ) for more information .
2024-03-16 09:15:13 -06:00
*
* \ since This function is available since SDL 3.0 .0 .
*/
extern DECLSPEC int SDLCALL SDL_GetPathInfo ( const char * path , SDL_PathInfo * info ) ;
2024-03-17 14:11:13 -06:00
/* Converts an SDL file time into a Windows FILETIME (100-nanosecond intervals since January 1, 1601).
*
* This function fills in the two 32 - bit values of the FILETIME structure .
2024-03-16 09:15:13 -06:00
*
* \ param ftime the time to convert
2024-03-17 14:11:13 -06:00
* \ param dwLowDateTime a pointer filled in with the low portion of the Windows FILETIME value
* \ param dwHighDateTime a pointer filled in with the high portion of the Windows FILETIME value
*
* \ since This function is available since SDL 3.0 .0 .
*/
extern DECLSPEC void SDLCALL SDL_FileTimeToWindows ( SDL_FileTime ftime , Uint32 * dwLowDateTime , Uint32 * dwHighDateTime ) ;
/* Converts a Windows FILETIME (100-nanosecond intervals since January 1, 1601) to an SDL file time
*
* This function takes the two 32 - bit values of the FILETIME structure as parameters .
*
* \ param dwLowDateTime the low portion of the Windows FILETIME value
* \ param dwHighDateTime the high portion of the Windows FILETIME value
* \ returns the converted file time
2024-03-16 09:15:13 -06:00
*
* \ since This function is available since SDL 3.0 .0 .
*/
2024-03-17 14:11:13 -06:00
extern DECLSPEC SDL_FileTime SDLCALL SDL_FileTimeFromWindows ( Uint32 dwLowDateTime , Uint32 dwHighDateTime ) ;
2024-03-16 09:15:13 -06:00
2015-06-21 09:33:46 -06:00
/* Ends C function definitions when using C++ */
# ifdef __cplusplus
}
# endif
2022-12-22 09:38:59 -07:00
# include <SDL3/SDL_close_code.h>
2015-06-21 09:33:46 -06:00
2016-11-20 22:34:54 -07:00
# endif /* SDL_filesystem_h_ */