From e0e95b1ea978fdf6234d8a8f3541854e0f12d711 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 4 May 2023 16:28:16 -0700 Subject: [PATCH] Fixed coding style and building on older Windows SDKs --- src/filesystem/windows/SDL_sysfilesystem.c | 280 ++++++++++----------- 1 file changed, 133 insertions(+), 147 deletions(-) diff --git a/src/filesystem/windows/SDL_sysfilesystem.c b/src/filesystem/windows/SDL_sysfilesystem.c index 46acf098b..a7693e9ee 100644 --- a/src/filesystem/windows/SDL_sysfilesystem.c +++ b/src/filesystem/windows/SDL_sysfilesystem.c @@ -26,17 +26,21 @@ /* System dependent filesystem routines */ #include "../../core/windows/SDL_windows.h" -#include -#include #include -#include -/* Lowercase is necessary for Wine */ -#include -#include -#include -char * -SDL_GetBasePath(void) +/* These aren't all defined in older SDKs, so define them here */ +DEFINE_KNOWN_FOLDER(SDL_FOLDERID_Profile, 0x5E6C858F, 0x0E22, 0x4760, 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73); +DEFINE_KNOWN_FOLDER(FOLDERID_Desktop, 0xB4BFCC3A, 0xDB2C, 0x424C, 0xB0, 0x29, 0x7F, 0xE9, 0x9A, 0x87, 0xC6, 0x41); +DEFINE_KNOWN_FOLDER(FOLDERID_Documents, 0xFDD39AD0, 0x238F, 0x46AF, 0xAD, 0xB4, 0x6C, 0x85, 0x48, 0x03, 0x69, 0xC7); +DEFINE_KNOWN_FOLDER(FOLDERID_Downloads, 0x374de290, 0x123f, 0x4565, 0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b); +DEFINE_KNOWN_FOLDER(FOLDERID_Music, 0x4BD8D571, 0x6D19, 0x48D3, 0xBE, 0x97, 0x42, 0x22, 0x20, 0x08, 0x0E, 0x43); +DEFINE_KNOWN_FOLDER(FOLDERID_Pictures, 0x33E28130, 0x4E1E, 0x4676, 0x83, 0x5A, 0x98, 0x39, 0x5C, 0x3B, 0xC3, 0xBB); +DEFINE_KNOWN_FOLDER(FOLDERID_SavedGames, 0x4c5c32ff, 0xbb9d, 0x43b0, 0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4); +DEFINE_KNOWN_FOLDER(FOLDERID_Screenshots, 0xb7bede81, 0xdf94, 0x4682, 0xa7, 0xd8, 0x57, 0xa5, 0x26, 0x20, 0xb8, 0x6f); +DEFINE_KNOWN_FOLDER(FOLDERID_Templates, 0xA63293E8, 0x664E, 0x48DB, 0xA0, 0x79, 0xDF, 0x75, 0x9E, 0x05, 0x09, 0xF7); +DEFINE_KNOWN_FOLDER(FOLDERID_Videos, 0x18989B1D, 0x99B5, 0x455B, 0x84, 0x1C, 0xAB, 0x7C, 0x74, 0xE4, 0xDD, 0xFC); + +char *SDL_GetBasePath(void) { DWORD buflen = 128; WCHAR *path = NULL; @@ -86,8 +90,7 @@ SDL_GetBasePath(void) return retval; } -char * -SDL_GetPrefPath(const char *org, const char *app) +char *SDL_GetPrefPath(const char *org, const char *app) { /* * Vista and later has a new API for this, but SHGetFolderPath works there, @@ -173,71 +176,133 @@ SDL_GetPrefPath(const char *org, const char *app) return retval; } -char * -SDL_GetPath(SDL_Folder folder) +char *SDL_GetPath(SDL_Folder folder) { - typedef HRESULT (*SHGKFP)(REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR *); - char *retval; + typedef HRESULT (*pfnSHGetKnownFolderPath)(REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR *); HMODULE lib = LoadLibrary(L"Shell32.dll"); - SHGKFP SHGetKnownFolderPath_ = (SHGKFP) GetProcAddress(lib, - "SHGetKnownFolderPath"); + pfnSHGetKnownFolderPath pSHGetKnownFolderPath = NULL; + char *retval = NULL; - if (!SHGetKnownFolderPath_) - { + if (lib) { + pSHGetKnownFolderPath = (pfnSHGetKnownFolderPath)GetProcAddress(lib, "SHGetKnownFolderPath"); + } + + if (pSHGetKnownFolderPath) { + KNOWNFOLDERID type; + HRESULT result; + wchar_t *path; + + switch (folder) { + case SDL_FOLDER_HOME: + type = FOLDERID_Profile; + break; + + case SDL_FOLDER_DESKTOP: + type = FOLDERID_Desktop; + break; + + case SDL_FOLDER_DOCUMENTS: + type = FOLDERID_Documents; + break; + + case SDL_FOLDER_DOWNLOADS: + type = FOLDERID_Downloads; + break; + + case SDL_FOLDER_MUSIC: + type = FOLDERID_Music; + break; + + case SDL_FOLDER_PICTURES: + type = FOLDERID_Pictures; + break; + + case SDL_FOLDER_PUBLICSHARE: + SDL_SetError("Public share unavailable on Windows"); + goto done; + + case SDL_FOLDER_SAVEDGAMES: + type = FOLDERID_SavedGames; + break; + + case SDL_FOLDER_SCREENSHOTS: + type = FOLDERID_Screenshots; + break; + + case SDL_FOLDER_TEMPLATES: + type = FOLDERID_Templates; + break; + + case SDL_FOLDER_VIDEOS: + type = FOLDERID_Videos; + break; + + default: + SDL_SetError("Invalid SDL_Folder: %d", (int)folder); + goto done; + }; + + result = pSHGetKnownFolderPath(&type, 0x00008000 /* KF_FLAG_CREATE */, NULL, &path); + if (SUCCEEDED(result)) { + retval = WIN_StringToUTF8W(path); + } else { + WIN_SetErrorFromHRESULT("Couldn't get folder", result); + } + + } else { int type; HRESULT result; - wchar_t path[MAX_PATH]; + wchar_t path[MAX_PATH]; - switch (folder) - { - case SDL_FOLDER_HOME: - type = CSIDL_PROFILE; - break; + switch (folder) { + case SDL_FOLDER_HOME: + type = CSIDL_PROFILE; + break; - case SDL_FOLDER_DESKTOP: - type = CSIDL_DESKTOP; - break; + case SDL_FOLDER_DESKTOP: + type = CSIDL_DESKTOP; + break; - case SDL_FOLDER_DOCUMENTS: - type = CSIDL_MYDOCUMENTS; - break; + case SDL_FOLDER_DOCUMENTS: + type = CSIDL_MYDOCUMENTS; + break; - case SDL_FOLDER_DOWNLOADS: - SDL_SetError("Downloads folder unavailable before Vista"); - return NULL; + case SDL_FOLDER_DOWNLOADS: + SDL_SetError("Downloads folder unavailable before Vista"); + goto done; - case SDL_FOLDER_MUSIC: - type = CSIDL_MYMUSIC; - break; + case SDL_FOLDER_MUSIC: + type = CSIDL_MYMUSIC; + break; - case SDL_FOLDER_PICTURES: - type = CSIDL_MYPICTURES; - break; + case SDL_FOLDER_PICTURES: + type = CSIDL_MYPICTURES; + break; - case SDL_FOLDER_PUBLICSHARE: - SDL_SetError("Public share unavailable on Windows"); - return NULL; + case SDL_FOLDER_PUBLICSHARE: + SDL_SetError("Public share unavailable on Windows"); + goto done; - case SDL_FOLDER_SAVEDGAMES: - SDL_SetError("Saved games unavailable before Vista"); - return NULL; + case SDL_FOLDER_SAVEDGAMES: + SDL_SetError("Saved games unavailable before Vista"); + goto done; - case SDL_FOLDER_SCREENSHOTS: - SDL_SetError("Screenshots folder unavailable before Vista"); - return NULL; + case SDL_FOLDER_SCREENSHOTS: + SDL_SetError("Screenshots folder unavailable before Vista"); + goto done; - case SDL_FOLDER_TEMPLATES: - type = CSIDL_TEMPLATES; - break; + case SDL_FOLDER_TEMPLATES: + type = CSIDL_TEMPLATES; + break; - case SDL_FOLDER_VIDEOS: - type = CSIDL_MYVIDEO; - break; + case SDL_FOLDER_VIDEOS: + type = CSIDL_MYVIDEO; + break; - default: - SDL_SetError("Unsupported SDL_Folder on Windows before Vista: %d", - (int) folder); - return NULL; + default: + SDL_SetError("Unsupported SDL_Folder on Windows before Vista: %d", + (int)folder); + goto done; }; /* Create the OS-specific folder if it doesn't already exist */ @@ -252,98 +317,19 @@ SDL_GetPath(SDL_Folder folder) available), available in Wine (tested 6.0.3) */ result = SHGetFolderPathW(NULL, type, NULL, SHGFP_TYPE_CURRENT, path); - /* use `!= TRUE` for SHGetSpecialFolderPath */ - if (result != S_OK) - { - SDL_SetError("Couldn't get folder, windows-specific error: %ld", - result); - return NULL; + /* use `== TRUE` for SHGetSpecialFolderPath */ + if (SUCCEEDED(result)) { + retval = WIN_StringToUTF8W(path); + } else { + WIN_SetErrorFromHRESULT("Couldn't get folder", result); } - - retval = (char *) SDL_malloc((SDL_wcslen(path) + 1) * 2); - if (retval == NULL) - { - SDL_OutOfMemory(); - return NULL; - } - retval = WIN_StringToUTF8W(path); - return retval; } - else - { - KNOWNFOLDERID type; - HRESULT result; - wchar_t *path; - switch (folder) - { - case SDL_FOLDER_HOME: - type = FOLDERID_Profile; - break; - - case SDL_FOLDER_DESKTOP: - type = FOLDERID_Desktop; - break; - - case SDL_FOLDER_DOCUMENTS: - type = FOLDERID_Documents; - break; - - case SDL_FOLDER_DOWNLOADS: - type = FOLDERID_Downloads; - break; - - case SDL_FOLDER_MUSIC: - type = FOLDERID_Music; - break; - - case SDL_FOLDER_PICTURES: - type = FOLDERID_Pictures; - break; - - case SDL_FOLDER_PUBLICSHARE: - SDL_SetError("Public share unavailable on Windows"); - return NULL; - - case SDL_FOLDER_SAVEDGAMES: - type = FOLDERID_SavedGames; - break; - - case SDL_FOLDER_SCREENSHOTS: - type = FOLDERID_Screenshots; - break; - - case SDL_FOLDER_TEMPLATES: - type = FOLDERID_Templates; - break; - - case SDL_FOLDER_VIDEOS: - type = FOLDERID_Videos; - break; - - default: - SDL_SetError("Invalid SDL_Folder: %d", (int) folder); - return NULL; - }; - - result = SHGetKnownFolderPath_(&type, KF_FLAG_CREATE, NULL, &path); - - if (result != S_OK) - { - SDL_SetError("Couldn't get folder, windows-specific error: %ld", - result); - return NULL; - } - - retval = (char *) SDL_malloc((SDL_wcslen(path) + 1) * 2); - if (retval == NULL) - { - SDL_OutOfMemory(); - return NULL; - } - retval = WIN_StringToUTF8W(path); - return retval; +done: + if (lib) { + FreeLibrary(lib); } + return retval; } #endif /* SDL_FILESYSTEM_WINDOWS */