diff --git a/include/MUtils/OSSupport.h b/include/MUtils/OSSupport.h index 8200e06..ca2cae9 100644 --- a/include/MUtils/OSSupport.h +++ b/include/MUtils/OSSupport.h @@ -105,12 +105,24 @@ namespace MUtils */ typedef enum { - FOLDER_ROAMING_DATA = 0, ///< Application-specific data - FOLDER_LOCALAPPDATA = 1, ///< Local application data (non-roaming) - FOLDER_USER_PROFILE = 2, ///< The user's profile folder - FOLDER_PROGRAMFILES = 3, ///< Program files - FOLDER_SYSTEMFOLDER = 4, ///< System directory - FOLDER_SYSTROOT_DIR = 5 ///< System "root" directory + FOLDER_PROFILE_USER = 1, ///< The user's profile folder + FOLDER_PROFILE_PUBL = 2, ///< The "all users" profile folder + FOLDER_APPDATA_ROAM = 3, ///< Application-specific data + FOLDER_APPDATA_LOCA = 4, ///< Local application data (non-roaming) + FOLDER_DOCS_USER = 5, ///< The user's Documents directory + FOLDER_DOCS_PUBL = 6, ///< The "all users" Documents directory + FOLDER_DESKTOP_USER = 7, ///< The user's Desktop directory + FOLDER_DESKTOP_PUBL = 8, ///< The "all users" Desktop directory + FOLDER_PICTURES_USER = 9, ///< The user's Music directory + FOLDER_PICTURES_PUBL = 10, ///< The user's Music directory + FOLDER_MUSIC_USER = 11, ///< The user's Music directory + FOLDER_MUSIC_PUBL = 12, ///< The "all users" Music directory + FOLDER_VIDEO_USER = 13, ///< The user's Video directory + FOLDER_VIDEO_PUBL = 14, ///< The "all users" Video directory + FOLDER_PROGRAMFILES = 15, ///< Program files + FOLDER_SYSROOT = 16, ///< System "root" directory + FOLDER_SYSTEM_DEF = 17, ///< System directory + FOLDER_SYSTEM_X86 = 18, ///< System directory for x86 (32-Bit) } known_folder_t; diff --git a/include/MUtils/Version.h b/include/MUtils/Version.h index 2753a43..3fdec3d 100644 --- a/include/MUtils/Version.h +++ b/include/MUtils/Version.h @@ -74,7 +74,7 @@ namespace MUtils #error Compiler version is not supported yet! #endif #elif (_MSC_VER == 1916) - #if((_MSC_FULL_VER >= 191627024) && (_MSC_FULL_VER <= 191627030)) + #if((_MSC_FULL_VER >= 191627024) && (_MSC_FULL_VER <= 191627031)) "MSVC 2017.9"; #else #error Compiler version is not supported yet! diff --git a/src/Global.cpp b/src/Global.cpp index 92d8a3f..845fd3f 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -420,7 +420,7 @@ const QString &MUtils::temp_folder(void) } qWarning("%%TEMP%% directory not found -> trying fallback mode now!"); - static const OS::known_folder_t FOLDER_ID[2] = { OS::FOLDER_LOCALAPPDATA, OS::FOLDER_SYSTROOT_DIR }; + static const OS::known_folder_t FOLDER_ID[2] = { OS::FOLDER_APPDATA_LOCA, OS::FOLDER_SYSROOT }; for(size_t id = 0; id < 2; id++) { const QString &knownFolder = OS::known_folder(FOLDER_ID[id]); @@ -572,7 +572,7 @@ void MUtils::init_process(QProcess &process, const QString &wokringDir, const bo } //Set up system root directory - const QString sysRoot = QDir::toNativeSeparators(OS::known_folder(OS::FOLDER_SYSTROOT_DIR)); + const QString sysRoot = QDir::toNativeSeparators(OS::known_folder(OS::FOLDER_SYSROOT)); if (!sysRoot.isEmpty()) { for (const char *const *ptr = ENVVAR_NAMES_SYS; *ptr; ++ptr) diff --git a/src/OSSupport_Win32.cpp b/src/OSSupport_Win32.cpp index b520959..d8e7563 100644 --- a/src/OSSupport_Win32.cpp +++ b/src/OSSupport_Win32.cpp @@ -695,21 +695,36 @@ typedef HRESULT (WINAPI *SHGetFolderPathProc)(HWND hwndOwner, int nFolder, HANDL static const struct { + MUtils::OS::known_folder_t id; INT32 csidl; - GUID kfuid; + GUID known_folder_id; } s_known_folders_lut[] = { - { 0x001A, { 0x3EB685DB, 0x65F9, 0x4CF6, { 0xA0, 0x3A, 0xE3, 0xEF, 0x65, 0x72, 0x9F, 0x3D } } }, //CSIDL_APPDATA - { 0x001C, { 0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 } } }, //CSIDL_LOCAL_APPDATA - { 0x0028, { 0x5E6C858F, 0x0E22, 0x4760, { 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73 } } }, //CSIDL_PROFILE - { 0x0026, { 0x905E63B6, 0xC1BF, 0x494E, { 0xB2, 0x9C, 0x65, 0xB7, 0x32, 0xD3, 0xD2, 0x1A } } }, //CSIDL_PROGRAM_FILES - { 0x0025, { 0x1AC14E77, 0x02E7, 0x4E5D, { 0xB7, 0x44, 0x2E, 0xB1, 0xAE, 0x51, 0x98, 0xB7 } } }, //CSIDL_SYSTEM_FOLDER - { 0x0024, { 0xF38BF404, 0x1D43, 0x42F2, { 0x93, 0x05, 0x67, 0xDE, 0x0B, 0x28, 0xFC, 0x23 } } }, //CSIDL_WINDOWS_FOLDER + { MUtils::OS::FOLDER_PROFILE_USER, 0x0028, { 0x5E6C858F, 0x0E22, 0x4760, { 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73 } } }, //CSIDL_PROFILE + { MUtils::OS::FOLDER_PROFILE_PUBL, 0x0000, { 0XDFDF76A2, 0XC82A, 0X4D63, { 0X90, 0X6A, 0X56, 0X44, 0XAC, 0X45, 0X73, 0X85 } } }, //FOLDERID_Public + { MUtils::OS::FOLDER_APPDATA_ROAM, 0x001A, { 0x3EB685DB, 0x65F9, 0x4CF6, { 0xA0, 0x3A, 0xE3, 0xEF, 0x65, 0x72, 0x9F, 0x3D } } }, //CSIDL_APPDATA + { MUtils::OS::FOLDER_APPDATA_LOCA, 0x001C, { 0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 } } }, //CSIDL_LOCAL_APPDATA + { MUtils::OS::FOLDER_DOCS_USER, 0x0005, { 0xFDD39AD0, 0x238F, 0x46AF, { 0xAD, 0xB4, 0x6C, 0x85, 0x48, 0x03, 0x69, 0xC7 } } }, //CSIDL_MYDOCUMENTS + { MUtils::OS::FOLDER_DOCS_PUBL, 0x002E, { 0xED4824AF, 0xDCE4, 0x45A8, { 0x81, 0xE2, 0xFC, 0x79, 0x65, 0x08, 0x36, 0x34 } } }, //CSIDL_COMMON_DOCUMENTS + { MUtils::OS::FOLDER_DESKTOP_USER, 0x0010, { 0xB4BFCC3A, 0xDB2C, 0x424C, { 0xB0, 0x29, 0x7F, 0xE9, 0x9A, 0x87, 0xC6, 0x41 } } }, //CSIDL_DESKTOPDIRECTORY + { MUtils::OS::FOLDER_DESKTOP_PUBL, 0x0019, { 0xC4AA340D, 0xF20F, 0x4863, { 0xAF, 0xEF, 0xF8, 0x7E, 0xF2, 0xE6, 0xBA, 0x25 } } }, //CSIDL_COMMON_DESKTOPDIRECTORY + { MUtils::OS::FOLDER_PICTURES_USER, 0x0027, { 0X33E28130, 0X4E1E, 0X4676, { 0X83, 0X5A, 0X98, 0X39, 0X5C, 0X3B, 0XC3, 0XBB } } }, //CSIDL_MYPICTURES + { MUtils::OS::FOLDER_PICTURES_PUBL, 0x0036, { 0XB6EBFB86, 0X6907, 0X413C, { 0X9A, 0XF7, 0X4F, 0XC2, 0XAB, 0XF0, 0X7C, 0XC5 } } }, //CSIDL_COMMON_PICTURES + { MUtils::OS::FOLDER_MUSIC_USER, 0x000D, { 0X4BD8D571, 0X6D19, 0X48D3, { 0XBE, 0X97, 0X42, 0X22, 0X20, 0X08, 0X0E, 0X43 } } }, //CSIDL_MYMUSIC + { MUtils::OS::FOLDER_MUSIC_PUBL, 0x0035, { 0X3214FAB5, 0X9757, 0X4298, { 0XBB, 0X61, 0X92, 0XA9, 0XDE, 0XAA, 0X44, 0XFF } } }, //CSIDL_COMMON_MUSIC + { MUtils::OS::FOLDER_VIDEO_USER, 0X000E, { 0X18989B1D, 0X99B5, 0X455B, { 0X84, 0X1C, 0XAB, 0X7C, 0X74, 0XE4, 0XDD, 0XFC } } }, //CSIDL_MYVIDEO + { MUtils::OS::FOLDER_VIDEO_PUBL, 0x0037, { 0X2400183A, 0X6185, 0X49FB, { 0XA2, 0XD8, 0X4A, 0X39, 0X2A, 0X60, 0X2B, 0XA3 } } }, //CSIDL_COMMON_VIDEO + { MUtils::OS::FOLDER_PROGRAMFILES, 0x0026, { 0x905E63B6, 0xC1BF, 0x494E, { 0xB2, 0x9C, 0x65, 0xB7, 0x32, 0xD3, 0xD2, 0x1A } } }, //CSIDL_PROGRAM_FILES + { MUtils::OS::FOLDER_SYSROOT, 0x0024, { 0xF38BF404, 0x1D43, 0x42F2, { 0x93, 0x05, 0x67, 0xDE, 0x0B, 0x28, 0xFC, 0x23 } } }, //CSIDL_WINDOWS + { MUtils::OS::FOLDER_SYSTEM_DEF, 0x0025, { 0x1AC14E77, 0x02E7, 0x4E5D, { 0xB7, 0x44, 0x2E, 0xB1, 0xAE, 0x51, 0x98, 0xB7 } } }, //CSIDL_SYSTEM + { MUtils::OS::FOLDER_SYSTEM_X86, 0x0029, { 0xD65231B0, 0xB2F1, 0x4857, { 0xA4, 0xCE, 0xA8, 0xE7, 0xC6, 0xEA, 0x7D, 0x27 } } }, //CSIDL_SYSTEMX86 + { static_cast(0) } }; static QString known_folder_verify(const wchar_t *const path) { + CSIDL_PROFILE; const QDir folderPath = QDir(QDir::fromNativeSeparators(MUTILS_QSTR(path))); if (folderPath.exists()) { @@ -741,21 +756,24 @@ static QString known_folder_fallback(const size_t folderId) MAXINT32 }; - const SHGetFolderPathProc getFolderPath = MUtils::Win32Utils::resolve(QLatin1String("shell32"), QLatin1String("SHGetFolderPathW")); - if (getFolderPath) + if (s_known_folders_lut[folderId].csidl) { - QVector pathBuffer(MAX_PATH); - for (size_t i = 0; s_shgfpTypes[i] != MAXDWORD; ++i) + const SHGetFolderPathProc getFolderPath = MUtils::Win32Utils::resolve(QLatin1String("shell32"), QLatin1String("SHGetFolderPathW")); + if (getFolderPath) { - for (size_t j = 0; s_shgfpFlags[j] != MAXINT32; ++j) + QVector pathBuffer(MAX_PATH); + for (size_t i = 0; s_shgfpTypes[i] != MAXDWORD; ++i) { - if (getFolderPath(NULL, s_known_folders_lut[folderId].csidl | s_shgfpFlags[j], NULL, s_shgfpTypes[i], pathBuffer.data()) == S_OK) + for (size_t j = 0; s_shgfpFlags[j] != MAXINT32; ++j) { - //MessageBoxW(0, path, L"SHGetFolderPathW", MB_TOPMOST); - const QString folderPath = known_folder_verify(pathBuffer.data()); - if (!folderPath.isEmpty()) + if (getFolderPath(NULL, s_known_folders_lut[folderId].csidl | s_shgfpFlags[j], NULL, s_shgfpTypes[i], pathBuffer.data()) == S_OK) { - return folderPath; + //MessageBoxW(0, path, L"SHGetFolderPathW", MB_TOPMOST); + const QString folderPath = known_folder_verify(pathBuffer.data()); + if (!folderPath.isEmpty()) + { + return folderPath; + } } } } @@ -790,7 +808,7 @@ static QString known_folder_detect(const size_t folderId) for (size_t i = 0; s_kfFlags[i] != MAXDWORD; ++i) { WCHAR* path = NULL; - if (getKnownFolderPath(s_known_folders_lut[folderId].kfuid, s_kfFlags[i], NULL, &path) == S_OK) + if (getKnownFolderPath(s_known_folders_lut[folderId].known_folder_id, s_kfFlags[i], NULL, &path) == S_OK) { //MessageBoxW(0, path, L"SHGetKnownFolderPath", MB_TOPMOST); const QString folderPath = known_folder_verify(path); @@ -808,18 +826,15 @@ static QString known_folder_detect(const size_t folderId) static size_t known_folder_decode(const MUtils::OS::known_folder_t folder_id) { - switch (folder_id) + for (size_t i = 0; s_known_folders_lut[i].id; ++i) { - case MUtils::OS::FOLDER_ROAMING_DATA: return 0U; - case MUtils::OS::FOLDER_LOCALAPPDATA: return 1U; - case MUtils::OS::FOLDER_USER_PROFILE: return 2U; - case MUtils::OS::FOLDER_PROGRAMFILES: return 3U; - case MUtils::OS::FOLDER_SYSTEMFOLDER: return 4U; - case MUtils::OS::FOLDER_SYSTROOT_DIR: return 5U; - default: - qWarning("Invalid 'known' folder was requested!"); - return SIZE_MAX; + if (s_known_folders_lut[i].id == folder_id) + { + return i; + } } + qWarning("Invalid 'known' folder was requested!"); + return SIZE_MAX; } const QString &MUtils::OS::known_folder(const known_folder_t folder_id) diff --git a/src/Sound_Win32.cpp b/src/Sound_Win32.cpp index 1df4396..bf6f8d5 100644 --- a/src/Sound_Win32.cpp +++ b/src/Sound_Win32.cpp @@ -122,7 +122,7 @@ bool MUtils::Sound::play_sound_file(const QString &library, const unsigned short QFileInfo libraryFile(library); if(!libraryFile.isAbsolute()) { - const QString &systemDir = MUtils::OS::known_folder(MUtils::OS::FOLDER_SYSTEMFOLDER); + const QString &systemDir = MUtils::OS::known_folder(MUtils::OS::FOLDER_SYSTEM_DEF); if(!systemDir.isEmpty()) { libraryFile.setFile(QDir(systemDir), libraryFile.fileName());