On 16 July 2018 at 23:46, Rob Walker bob.mt.wya@gmail.com wrote:
XDG_UserDirLookup() will return a NULL result for any XDG directory path that is not a valid directory or is a broken symlinked directory path. So we can remove a redundant test, that ensures the returned XDG_DOCUMENTS_DIR path is a valid directory. Tidy up the inline code comments, removing some that are unnecessary.
Signed-off-by: Rob Walker bob.mt.wya@gmail.com
dlls/shell32/shellpath.c | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index de4bf7d566..0d8a5987d7 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -4424,7 +4424,7 @@ static void _SHCreateSymbolicLinks(void) char ** xdg_results; char * xdg_desktop_dir;
- /* Create all necessary profile sub-dirs up to 'My Documents' and get
the unix path. */
- /* Create the '%USERPROFILE%\My Documents' directory path. */ hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_DEFAULT, wszTempPath); if (FAILED(hr)) return;
@@ -4439,7 +4439,7 @@ static void _SHCreateSymbolicLinks(void) { while (1) {
/* Check if there's already a Wine-specific 'My Documents'
folder */
/* 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)) @@ -4457,28 +4457,23 @@ static void _SHCreateSymbolicLinks(void) break; }
/* Try to point to the XDG Documents folder */
if (xdg_results && xdg_results[num-2] &&
!stat(xdg_results[num-2], &statFolder) &&
S_ISDIR(statFolder.st_mode))
/* Try to target the XDG_DOCUMENTS_DIR folder. */
if (xdg_results && xdg_results[num-2]) { strcpy(szPersonalTarget, xdg_results[num-2]); break; }
/* Or the hardcoded / OS X Documents folder */
/* Try to target the hardcoded / OS X 'Documents' folder. */ strcpy(szPersonalTarget, pszHome); if (_SHAppendToUnixPath(szPersonalTarget, DocumentsW) &&
!stat(szPersonalTarget, &statFolder) &&
S_ISDIR(statFolder.st_mode))
!stat(szPersonalTarget, &statFolder) &&
S_ISDIR(statFolder.st_mode)) break;
/* As a last resort point to $HOME. */
/* Target the '$HOME' folder directly (fallback). */ strcpy(szPersonalTarget, pszHome); break; }
/* Replace 'My Documents' directory with a symlink or fail
silently if not empty. */ remove(pszPersonal); symlink(szPersonalTarget, pszPersonal); } @@ -4498,30 +4493,30 @@ static void _SHCreateSymbolicLinks(void) /* Create symbolic links for 'My Pictures', 'My Videos' and 'My Music'. */ for (i=0; i < ARRAY_SIZE(aidsMyStuff); i++) {
/* Create the current 'My Whatever' folder and get its unix path.
*/
/* Create the '%USERPROFILE%\\My XXX' directory path. */ hr = SHGetFolderPathW(NULL, acsidlMyStuff[i]|CSIDL_FLAG_CREATE,
NULL, SHGFP_TYPE_DEFAULT, wszTempPath); if (FAILED(hr)) continue;
pszMyStuff = wine_get_unix_file_name(wszTempPath); if (!pszMyStuff) continue;
while (1) {
/* Check for the Wine-specific '$HOME/My Documents' subfolder
*/
/* Try to target a pre-existing '$HOME/My Documents/My XXX'
folder. */ strcpy(szMyStuffTarget, szPersonalTarget); if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i])) && !stat(szMyStuffTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) break;
/* Try the XDG_XXX_DIR folder */
/* Try to target the XDG_XXX_DIR folder. */ if (xdg_results && xdg_results[i]) { strcpy(szMyStuffTarget, xdg_results[i]); break; }
/* Or the OS X folder (these are never localized) */
/* Try to target the hardcoded / OS X 'XXX' folder. */ if (pszHome) { strcpy(szMyStuffTarget, pszHome);
@@ -4531,7 +4526,7 @@ static void _SHCreateSymbolicLinks(void) break; }
/* As a last resort point to the same location as 'My
Documents' */
/* Use the same target as '%USERPROFILE%\\My Documents'
(fallback). */ strcpy(szMyStuffTarget, szPersonalTarget); break; } @@ -4540,7 +4535,7 @@ static void _SHCreateSymbolicLinks(void) heap_free(pszMyStuff); }
- /* Last but not least, the Desktop folder */
- /* Create a symbolic link for the 'Desktop' folder. */ if (pszHome) strcpy(szDesktopTarget, pszHome); else
@@ -4552,6 +4547,7 @@ static void _SHCreateSymbolicLinks(void) (_SHAppendToUnixPath(szDesktopTarget, DesktopW) && !stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode))) {
/* Get the '%USERPROFILE%\\Desktop' directory path. */ hr = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE,
NULL, SHGFP_TYPE_DEFAULT, wszTempPath); if (SUCCEEDED(hr) && (pszDesktop = wine_get_unix_file_name(wszTempPath)))
@@ -4565,7 +4561,6 @@ static void _SHCreateSymbolicLinks(void) } }
- /* Free resources allocated by XDG_UserDirLookup() */ if (xdg_results) { for (i = 0; i < num; i++)
-- 2.18.0
This patchset is to primarily refactor: _SHCreateSymbolicLinks() It is intended to make the existing code less opaque, more streamlined and easier to work with. Although the _SHCreateSymbolicLinks() functionality is quite simple, the existing implementation is hard to parse/ spaghetti code.
FYI I obviously still have patches ready to submit, which will fix:
* https://bugs.winehq.org/show_bug.cgi?id=41668 * https://bugs.winehq.org/show_bug.cgi?id=28216
that depend heavily on this code clean-up. Plus an implementation of the Windows Vista(+) compatiblility junction links (again which depends on this patchset).
All the best, Robert