Move creation of the 5 User Profile directories:
'%USERPROFILE%\My Documents' '%USERPROFILE%\My Music' '%USERPROFILE%\My Pictures' '%USERPROFILE%\My Videos' '%USERPROFILE%\Desktop'
into a single unified loop. This improves code readability and reduces code length / complexity. Make the arrays, of encoded directory designators, use a consistent ordering. Reword inline code comments as necessary to be consistent with new code structure.
Signed-off-by: Rob Walker bob.mt.wya@gmail.com --- dlls/shell32/shellpath.c | 109 +++++++-------------------------------- 1 file changed, 18 insertions(+), 91 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index faa8c892e9..ce8af7760c 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -4409,27 +4409,20 @@ static inline BOOL _SHAppendToUnixPath(char *szBasePath, LPCWSTR pwszSubPath) { */ static void _SHCreateSymbolicLinks(void) { - UINT aidsMyStuff[] = { IDS_MYPICTURES, IDS_MYVIDEOS, IDS_MYMUSIC }, i; - const WCHAR* MyOSXStuffW[] = { PicturesW, MoviesW, MusicW }; - int acsidlMyStuff[] = { CSIDL_MYPICTURES, CSIDL_MYVIDEO, CSIDL_MYMUSIC }; - static const char * const xdg_dirs[] = { "PICTURES", "VIDEOS", "MUSIC", "DOCUMENTS", "DESKTOP" }; + UINT aidsMyStuff[] = { IDS_PERSONAL, IDS_MYMUSIC, IDS_MYPICTURES, IDS_MYVIDEOS, IDS_DESKTOPDIRECTORY }; + const WCHAR* MyOSXStuffW[] = { DocumentsW, MusicW, PicturesW, MoviesW, DesktopW }; + int acsidlMyStuff[] = { CSIDL_PERSONAL, CSIDL_MYMUSIC, CSIDL_MYPICTURES, CSIDL_MYVIDEO, CSIDL_DESKTOPDIRECTORY }; + static const char * const xdg_dirs[] = { "DOCUMENTS", "MUSIC", "PICTURES", "VIDEOS", "DESKTOP" }; static const unsigned int num = ARRAY_SIZE(xdg_dirs); WCHAR wszTempPath[MAX_PATH]; - char szPersonalTarget[FILENAME_MAX], *pszPersonal; char szMyStuffTarget[FILENAME_MAX], *pszMyStuff; - char szDesktopTarget[FILENAME_MAX], *pszDesktop; struct stat statFolder; const char *pszHome; HRESULT hr; BOOL target_ok; char ** xdg_results; - - /* Create the '%USERPROFILE%\My Documents' directory path. */ - hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL, - SHGFP_TYPE_DEFAULT, wszTempPath); - if (FAILED(hr)) return; - pszPersonal = wine_get_unix_file_name(wszTempPath); - if (!pszPersonal) return; + int ret; + UINT i;
hr = XDG_UserDirLookup(xdg_dirs, num, &xdg_results); if (FAILED(hr)) xdg_results = NULL; @@ -4438,45 +4431,9 @@ static void _SHCreateSymbolicLinks(void) if (!(pszHome && !stat(pszHome, &statFolder) && S_ISDIR(statFolder.st_mode))) pszHome = NULL;
- if (pszHome) + for (i = 0; i < num; ++i) { - target_ok = FALSE; - - /* Try to target a pre-existing '$HOME/My Documents' folder. */ - strcpy(szPersonalTarget, pszHome); - if (_SHAppendToUnixPath(szPersonalTarget, MAKEINTRESOURCEW(IDS_PERSONAL)) && - !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) - { - target_ok = TRUE; - } - /* Try to target the XDG_DOCUMENTS_DIR folder. */ - else if (xdg_results && xdg_results[num-2]) - { - strcpy(szPersonalTarget, xdg_results[num-2]); - target_ok = TRUE; - } - /* Try to target the hardcoded / OS X 'Documents' folder. */ - else - { - strcpy(szPersonalTarget, pszHome); - target_ok = _SHAppendToUnixPath(szPersonalTarget, DocumentsW) - && !stat(szPersonalTarget, &statFolder) - && S_ISDIR(statFolder.st_mode); - } - - if (target_ok) - { - remove(pszPersonal); - symlink(szPersonalTarget, pszPersonal); - } - - heap_free(pszPersonal); - } - - /* Create symbolic links for 'My Pictures', 'My Videos' and 'My Music'. */ - for (i=0; i < ARRAY_SIZE(aidsMyStuff); i++) - { - /* Create the '%USERPROFILE%\My XXX' directory path. */ + /* Create the '%USERPROFILE%\XXX' directory path. */ hr = SHGetFolderPathW(NULL, acsidlMyStuff[i]|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_DEFAULT, wszTempPath); if (FAILED(hr) || !pszHome) continue; @@ -4485,10 +4442,10 @@ static void _SHCreateSymbolicLinks(void) if (!pszMyStuff) continue;
target_ok = FALSE; - - /* Try to target a pre-existing '$HOME/My Documents/My XXX' folder. */ + /* Try to target a pre-existing '$HOME/My XXX' folder. */ strcpy(szMyStuffTarget, pszHome); - if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i])) && + if ((aidsMyStuff[i] != IDS_DESKTOPDIRECTORY) && + _SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i])) && !stat(szMyStuffTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) { target_ok = TRUE; @@ -4510,47 +4467,17 @@ static void _SHCreateSymbolicLinks(void)
if (target_ok) { - remove(pszMyStuff); - symlink(szMyStuffTarget, pszMyStuff); + ret = remove(pszMyStuff); + TRACE("remove directory (%s): %s\n", + (ret ? "soft failed" : "OK"), debugstr_a(pszMyStuff)); + ret = symlink(szMyStuffTarget, pszMyStuff); + TRACE("symlink directory (%s): %s -> %s\n", + (ret ? "soft failed" : "OK"), + debugstr_a(pszMyStuff), debugstr_a(szMyStuffTarget)); } heap_free(pszMyStuff); }
- /* Get the '%USERPROFILE%\Desktop' directory path. */ - hr = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, NULL, - SHGFP_TYPE_DEFAULT, wszTempPath); - if (SUCCEEDED(hr) && pszHome) - { - /* Create a symbolic link for the 'Desktop' folder. */ - pszDesktop = wine_get_unix_file_name(wszTempPath); - if (pszDesktop) - { - strcpy(szDesktopTarget, pszHome); - i = num - 1; - /* Try to target the XDG_DESKTOP_DIR folder. */ - if (xdg_results && xdg_results[i]) - { - strcpy(szDesktopTarget, xdg_results[i]); - target_ok = TRUE; - } - /* Try to target the hardcoded / OS X 'Desktop' folder. */ - else - { - strcpy(szDesktopTarget, pszHome); - target_ok = _SHAppendToUnixPath(szDesktopTarget, DesktopW) - && !stat(szDesktopTarget, &statFolder) - && S_ISDIR(statFolder.st_mode); - } - - if (target_ok) - { - remove(pszDesktop); - symlink(szDesktopTarget, pszDesktop); - } - heap_free(pszDesktop); - } - } - if (xdg_results) { for (i = 0; i < num; i++)