Various improvements to known_folder() function, again.
This commit is contained in:
parent
1ea1c23d12
commit
aa434dd678
@ -105,12 +105,24 @@ namespace MUtils
|
|||||||
*/
|
*/
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
FOLDER_ROAMING_DATA = 0, ///< Application-specific data
|
FOLDER_PROFILE_USER = 1, ///< The user's profile folder
|
||||||
FOLDER_LOCALAPPDATA = 1, ///< Local application data (non-roaming)
|
FOLDER_PROFILE_PUBL = 2, ///< The "all users" profile folder
|
||||||
FOLDER_USER_PROFILE = 2, ///< The user's profile folder
|
FOLDER_APPDATA_ROAM = 3, ///< Application-specific data
|
||||||
FOLDER_PROGRAMFILES = 3, ///< Program files
|
FOLDER_APPDATA_LOCA = 4, ///< Local application data (non-roaming)
|
||||||
FOLDER_SYSTEMFOLDER = 4, ///< System directory
|
FOLDER_DOCS_USER = 5, ///< The user's Documents directory
|
||||||
FOLDER_SYSTROOT_DIR = 5 ///< System "root" 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;
|
known_folder_t;
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ namespace MUtils
|
|||||||
#error Compiler version is not supported yet!
|
#error Compiler version is not supported yet!
|
||||||
#endif
|
#endif
|
||||||
#elif (_MSC_VER == 1916)
|
#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";
|
"MSVC 2017.9";
|
||||||
#else
|
#else
|
||||||
#error Compiler version is not supported yet!
|
#error Compiler version is not supported yet!
|
||||||
|
@ -420,7 +420,7 @@ const QString &MUtils::temp_folder(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
qWarning("%%TEMP%% directory not found -> trying fallback mode now!");
|
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++)
|
for(size_t id = 0; id < 2; id++)
|
||||||
{
|
{
|
||||||
const QString &knownFolder = OS::known_folder(FOLDER_ID[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
|
//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())
|
if (!sysRoot.isEmpty())
|
||||||
{
|
{
|
||||||
for (const char *const *ptr = ENVVAR_NAMES_SYS; *ptr; ++ptr)
|
for (const char *const *ptr = ENVVAR_NAMES_SYS; *ptr; ++ptr)
|
||||||
|
@ -695,21 +695,36 @@ typedef HRESULT (WINAPI *SHGetFolderPathProc)(HWND hwndOwner, int nFolder, HANDL
|
|||||||
|
|
||||||
static const struct
|
static const struct
|
||||||
{
|
{
|
||||||
|
MUtils::OS::known_folder_t id;
|
||||||
INT32 csidl;
|
INT32 csidl;
|
||||||
GUID kfuid;
|
GUID known_folder_id;
|
||||||
}
|
}
|
||||||
s_known_folders_lut[] =
|
s_known_folders_lut[] =
|
||||||
{
|
{
|
||||||
{ 0x001A, { 0x3EB685DB, 0x65F9, 0x4CF6, { 0xA0, 0x3A, 0xE3, 0xEF, 0x65, 0x72, 0x9F, 0x3D } } }, //CSIDL_APPDATA
|
{ MUtils::OS::FOLDER_PROFILE_USER, 0x0028, { 0x5E6C858F, 0x0E22, 0x4760, { 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73 } } }, //CSIDL_PROFILE
|
||||||
{ 0x001C, { 0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 } } }, //CSIDL_LOCAL_APPDATA
|
{ MUtils::OS::FOLDER_PROFILE_PUBL, 0x0000, { 0XDFDF76A2, 0XC82A, 0X4D63, { 0X90, 0X6A, 0X56, 0X44, 0XAC, 0X45, 0X73, 0X85 } } }, //FOLDERID_Public
|
||||||
{ 0x0028, { 0x5E6C858F, 0x0E22, 0x4760, { 0x9A, 0xFE, 0xEA, 0x33, 0x17, 0xB6, 0x71, 0x73 } } }, //CSIDL_PROFILE
|
{ MUtils::OS::FOLDER_APPDATA_ROAM, 0x001A, { 0x3EB685DB, 0x65F9, 0x4CF6, { 0xA0, 0x3A, 0xE3, 0xEF, 0x65, 0x72, 0x9F, 0x3D } } }, //CSIDL_APPDATA
|
||||||
{ 0x0026, { 0x905E63B6, 0xC1BF, 0x494E, { 0xB2, 0x9C, 0x65, 0xB7, 0x32, 0xD3, 0xD2, 0x1A } } }, //CSIDL_PROGRAM_FILES
|
{ MUtils::OS::FOLDER_APPDATA_LOCA, 0x001C, { 0xF1B32785, 0x6FBA, 0x4FCF, { 0x9D, 0x55, 0x7B, 0x8E, 0x7F, 0x15, 0x70, 0x91 } } }, //CSIDL_LOCAL_APPDATA
|
||||||
{ 0x0025, { 0x1AC14E77, 0x02E7, 0x4E5D, { 0xB7, 0x44, 0x2E, 0xB1, 0xAE, 0x51, 0x98, 0xB7 } } }, //CSIDL_SYSTEM_FOLDER
|
{ MUtils::OS::FOLDER_DOCS_USER, 0x0005, { 0xFDD39AD0, 0x238F, 0x46AF, { 0xAD, 0xB4, 0x6C, 0x85, 0x48, 0x03, 0x69, 0xC7 } } }, //CSIDL_MYDOCUMENTS
|
||||||
{ 0x0024, { 0xF38BF404, 0x1D43, 0x42F2, { 0x93, 0x05, 0x67, 0xDE, 0x0B, 0x28, 0xFC, 0x23 } } }, //CSIDL_WINDOWS_FOLDER
|
{ 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<MUtils::OS::known_folder_t>(0) }
|
||||||
};
|
};
|
||||||
|
|
||||||
static QString known_folder_verify(const wchar_t *const path)
|
static QString known_folder_verify(const wchar_t *const path)
|
||||||
{
|
{
|
||||||
|
CSIDL_PROFILE;
|
||||||
const QDir folderPath = QDir(QDir::fromNativeSeparators(MUTILS_QSTR(path)));
|
const QDir folderPath = QDir(QDir::fromNativeSeparators(MUTILS_QSTR(path)));
|
||||||
if (folderPath.exists())
|
if (folderPath.exists())
|
||||||
{
|
{
|
||||||
@ -741,21 +756,24 @@ static QString known_folder_fallback(const size_t folderId)
|
|||||||
MAXINT32
|
MAXINT32
|
||||||
};
|
};
|
||||||
|
|
||||||
const SHGetFolderPathProc getFolderPath = MUtils::Win32Utils::resolve<SHGetFolderPathProc>(QLatin1String("shell32"), QLatin1String("SHGetFolderPathW"));
|
if (s_known_folders_lut[folderId].csidl)
|
||||||
if (getFolderPath)
|
|
||||||
{
|
{
|
||||||
QVector<WCHAR> pathBuffer(MAX_PATH);
|
const SHGetFolderPathProc getFolderPath = MUtils::Win32Utils::resolve<SHGetFolderPathProc>(QLatin1String("shell32"), QLatin1String("SHGetFolderPathW"));
|
||||||
for (size_t i = 0; s_shgfpTypes[i] != MAXDWORD; ++i)
|
if (getFolderPath)
|
||||||
{
|
{
|
||||||
for (size_t j = 0; s_shgfpFlags[j] != MAXINT32; ++j)
|
QVector<WCHAR> 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);
|
if (getFolderPath(NULL, s_known_folders_lut[folderId].csidl | s_shgfpFlags[j], NULL, s_shgfpTypes[i], pathBuffer.data()) == S_OK)
|
||||||
const QString folderPath = known_folder_verify(pathBuffer.data());
|
|
||||||
if (!folderPath.isEmpty())
|
|
||||||
{
|
{
|
||||||
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)
|
for (size_t i = 0; s_kfFlags[i] != MAXDWORD; ++i)
|
||||||
{
|
{
|
||||||
WCHAR* path = NULL;
|
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);
|
//MessageBoxW(0, path, L"SHGetKnownFolderPath", MB_TOPMOST);
|
||||||
const QString folderPath = known_folder_verify(path);
|
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)
|
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;
|
if (s_known_folders_lut[i].id == folder_id)
|
||||||
case MUtils::OS::FOLDER_LOCALAPPDATA: return 1U;
|
{
|
||||||
case MUtils::OS::FOLDER_USER_PROFILE: return 2U;
|
return i;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
qWarning("Invalid 'known' folder was requested!");
|
||||||
|
return SIZE_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString &MUtils::OS::known_folder(const known_folder_t folder_id)
|
const QString &MUtils::OS::known_folder(const known_folder_t folder_id)
|
||||||
|
@ -122,7 +122,7 @@ bool MUtils::Sound::play_sound_file(const QString &library, const unsigned short
|
|||||||
QFileInfo libraryFile(library);
|
QFileInfo libraryFile(library);
|
||||||
if(!libraryFile.isAbsolute())
|
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())
|
if(!systemDir.isEmpty())
|
||||||
{
|
{
|
||||||
libraryFile.setFile(QDir(systemDir), libraryFile.fileName());
|
libraryFile.setFile(QDir(systemDir), libraryFile.fileName());
|
||||||
|
Loading…
Reference in New Issue
Block a user